我对C中的父/子进程有一个小问题:子进程如何访问父进程在fork之后打开的文件描述符?
5 回答
假设问题是关于父进程分叉然后打开新的文件描述符:简短的回答是:它不能。
有一些特定于平台的方法可以在进程之间传递文件描述符(例如,使用 unix 套接字发送的 SCM_RIGHTS 辅助消息),但它们不依赖于进程的父子关系。
文件描述符是通过fork
系统调用携带的,因此子进程可以随意使用它们。man 2 pipe
这就是通常使用管道的 IPC(请参阅 参考资料)完成的方式。
如果您需要访问在 fork 之后打开的文件描述符,您可以使用sendmsg
. 请参阅如何使用 sendmsg() 在 2 个进程之间通过套接字发送文件描述符?
在 fork() 之后,子进程得到它自己的父文件描述符的副本。
子文件的每个文件描述符与父文件的相应文件描述符引用相同的打开文件描述。
一旦他们拥有自己的文件描述符副本,子/父关系就无关紧要了。它与使用自己的文件描述符集访问同一文件的两个不同进程相同。之后文件锁定和同步可能会发挥作用。
[已编辑 - 抱歉误读了问题,您不能因为进程不共享相同的内存空间。最好在分叉之前打开文件描述符或使用其他 IPC 机制,具体取决于您要实现的目标]
子进程将继承父进程的文件描述符,因此可以直接使用。
void example()
{
int fd = open("My file", O_WRONLY );
pid_t pid = fork();
if(pid == 0)
{
/* child */
char * child_msg = "Hi there from child\n";
write(fd, my_msg, sizeof(my_msg);
/* ... other stuff */
}
else
{
/* parent */
char * parent_msg = "Hi there from parent\n";
write(fd, my_msg, sizeof(my_msg);
/* ... other stuff */
}
}
两条消息都将写入“我的文件”
你的问题不清楚。
无论如何,如果您尝试在使用父进程的子进程中使用数据,则可以将数据从父进程传输到子进程。为简化起见,只需在POSIX int pipe(int anFD[2])
中使用匿名管道,然后您就可以使用write
and read
(offread
和fwrite
函数)。在父进程中,您必须使用函数popen
打开具有写/读访问权限的文件。
请记住,这fork()
是一个完整的副本(父母和孩子有共享页面,这些页面是只读的)。如果您尝试在源页面中写入,内核将检查子进程是否是一个所有者,然后该源页面将可写)。