Open() системен файлов десриптор

Трябва да коригирам върнатата стойност на open() syscall на posix OS. Разбрах от man-Pages, че трябва да върне дескриптора на файла и в случай на грешка системното извикване ще върне -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 OS. Обаждането изпраща необходимите данни за отваряне на файл към ядрото чрез call_system(). След като call_system(msg) направи своята магия и файлът е или не е отворен, трябва да върна fd на този файл или -1 в случай на грешка. Сега msg съдържа данните, които ядрото използва, за да отвори нов nod. но след като възелът се отвори, той не задава файлов дескриптор за това кимване. Ще публикувам метода call_system(). - person Niinle; 09.11.2014