Описатель файла системного вызова Open()

Мне нужно исправить возвращаемое значение системного вызова open() ОС posix. Из справочных страниц я понял, что он должен возвращать файловый дескриптор, а в случае ошибки системный вызов вернет -1 и установит errno значение. Проблема в том, что я не знаю, как получить файловый дескриптор для открытого узла. Я проверил все файлы и не нашел метода, который может назначать fd процессам.

Вот метод:

    int syscalls::open(const char *path, int oflags, mode_t mode){

    syscall_message msg;

    msg.call.type = syscalls::open_call;
    msg.open_data.path_name = &path[0];
    msg.open_data.flags = oflags;
    msg.open_data.create_mode = mode;

    syscaller::call_system(msg);

    return msg.error.number;
}

syscall_message — это структура, содержащая информацию о данных для системного вызова. syscalls — это namesapace, где находятся все системные вызовы. syscaller используется для отправки вызова ядру, отменяя метод call_system.

Метод call_system:

syscalls::open_call:
        {
            //get the file
            i_fs_node_ptr file = i_fs::open_node( msg.open_data.path_name );

            //add the file handle
            if ( file )
            {
                cur_process->push_filehandle(
                        file,
                        msg.open_data.flags,
                        msg.open_data.create_mode );
            }
            else
            {
                msg.error.type = syscalls::e_no_such_entry;
            }

        }

person Niinle    schedule 09.11.2014    source источник
comment
Что такое syscall_message, syscalls и syscaller? Являются ли они частью какой-то используемой вами библиотеки или фреймворка?   -  person    schedule 09.11.2014


Ответы (1)


Я не знаю, что вы подразумеваете под «я не могу получить дескриптор файла». Как вы упомянули, open() возвращает его. Он просто хранится в целочисленной переменной. Если эта переменная равна -1, значит что-то пошло не так. Например, если у вас есть

int file = open(path, O_SYNC, O_DIRECT, O_RDONLY);

но у вас нет прав на чтение файла с именем path, переменная file получит значение -1. Дополнительные манипуляции с открытым файлом можно выполнить с помощью read() (если файл был открыт в режиме чтения) и write() (если файл был открыт в режиме записи). Я предлагаю вам более внимательно прочитать документацию по функции open(). Если вам нужен больший контроль над дескриптором файла, я предлагаю вам использовать fopen():

person rbaleksandar    schedule 09.11.2014
comment
Да, но я имею в виду то, как работает open() системный вызов. Опубликованный мной метод — это системный вызов open() для ОС Posix. Вызов отправляет данные, необходимые для открытия файла, ядру через call_system(). После того, как call_system(msg) совершит свое волшебство и файл будет открыт или не открыт, я должен вернуть fd этого файла или -1 в случае ошибки. Теперь msg содержит данные, которые ядро ​​использует для открытия нового узла. но после открытия узла он не устанавливает дескриптор файла для этого узла. Выложу метод call_system(). - person Niinle; 09.11.2014