我必须更正posix OS的open() syscall的返回值。我从手册页了解到它必须返回文件描述符,并且,如果发生错误,系统调用将返回-1并设置errno值。问题是我不知道如何获取打开的nod的文件描述符。我检查了所有文件,但没有找到可以为进程分配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;
            }

        }

最佳答案

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

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

但您没有名为路径的文件的读取权限,变量文件的值将为-1。可以通过 read()(如果文件以读取模式打开)和 write()(如果文件以写入模式打开)对打开的文件进行其他操作。我建议您仔细阅读documentation on the open() function。如果您需要对文件描述符的更多控制,建议您使用 fopen():
  • Discussion on the difference between open() and fopen()
  • Tutorial on fopen()
  • Documentation on fopen()
  • 07-24 22:29