Open()系统调用filedesriptor

时间:2014-11-09 19:12:46

标签: c++ operating-system system-calls

我必须更正posix操作系统的open()系统调用的返回值。我从 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是所有系统调用所在的namesapacesyscaller用于将调用发送到内核,取消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;
            }

        }

1 个答案:

答案 0 :(得分:1)

我不知道你的意思是“我无法获取文件描述符”。正如你所提到的,open()返回它。它只是存储在一个整数变量中。如果此变量等于-1,则出现问题。例如,如果你有

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

但您没有名为路径的文件的阅读权限,变量文件将获得值-1。打开文件的其他操作可以通过 read()(如果文件在读取模式下打开)和 write()(如果文件在写入模式下打开)完成。我建议你仔细阅读documentation on the open() function。如果你需要更多地控制文件描述符,我建议你使用 fopen()