我必须更正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
是所有系统调用所在的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;
}
}
答案 0 :(得分:1)
我不知道你的意思是“我无法获取文件描述符”。正如你所提到的,open()返回它。它只是存储在一个整数变量中。如果此变量等于-1,则出现问题。例如,如果你有
int file = open(path, O_SYNC, O_DIRECT, O_RDONLY);
但您没有名为路径的文件的阅读权限,变量文件将获得值-1。打开文件的其他操作可以通过 read()(如果文件在读取模式下打开)和 write()(如果文件在写入模式下打开)完成。我建议你仔细阅读documentation on the open() function。如果你需要更多地控制文件描述符,我建议你使用 fopen():