我对C中的父/子进程有一点问题:子进程如何处理访问 fork后父进程打开的文件描述符?
答案 0 :(得分:4)
假设问题是关于父进程分叉然后打开新文件描述符: 简短的回答是:它不能。
有特定于平台的方法在进程之间传递文件描述符(例如,使用unix套接字发送的SCM_RIGHTS辅助消息),但它们不依赖于进程的父子关系。
答案 1 :(得分:3)
文件描述符通过fork
系统调用传递,因此子进程可以随意使用它们。这就是IPC管道(见man 2 pipe
)通常的完成方式。
如果需要访问fork之后打开的文件描述符,可以通过sendmsg
的UNIX套接字发送它们。见How to use sendmsg() to send a file-descriptor via sockets between 2 processes?
答案 2 :(得分:1)
在fork()之后,子进程获取其父文件描述符的自己的副本。
每个子文件描述符引用相同的打开文件描述以及父文件的相应文件描述符。
一旦他们拥有自己的文件描述符副本,子/父关系无关紧要。它与使用自己的文件描述符集访问同一文件的两个不同进程相同。之后文件锁定和同步可能会发挥作用。
答案 3 :(得分:0)
[redited - 对不起误读了这个问题,你不能因为进程不共享相同的内存空间。最好是在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 */
}
}
这两条消息都将写入“我的文件”
答案 4 :(得分:0)
你的问题不清楚。
无论如何,如果您尝试在使用父级的子进程中使用数据,则可以将数据从父级传输到子级。为了简化,只需在 POSIX int pipe(int anFD[2])
中使用匿名管道,然后就可以使用write
和read
(fread
和fwrite
功能)。在父进程中,您必须使用函数popen
来打开具有写/读访问权限的文件。
请记住,fork()
执行完整副本(父级和子级具有共享页面,并且这些页面是只读的)。如果您尝试在源页面中写入,内核将检查子进程是否是一个所有者,然后此源页面将是可写的。