我有一个关于C中的父/子进程的小问题:子进程如何访问父进程在 fork之后打开的文件描述符?
假设问题是关于父进程分叉,然后打开新的文件描述符:简短的回答是:不能。
有特定于平台的方法在进程之间传递文件描述符(例如SCM_RIGHTS辅助消息与unix套接字发送),但它们不依赖于进程的父子关系。
文件描述符通过fork
系统调用传递,因此子进程可以随意使用它们。这就是IPC与管道(参见man 2 pipe
)通常是如何完成的。
如果你需要访问在fork之后打开的文件描述符,你可以通过UNIX套接字sendmsg
发送它们。参见如何使用sendmsg()在两个进程之间通过套接字发送文件描述符?
fork()之后,子进程获得父进程文件描述符的副本。
每个子文件描述符引用与父文件对应的文件描述符相同的打开文件描述符。
一旦它们有了自己的文件描述符副本,子/父关系就不重要了。这就好比两个不同的进程用各自的文件描述符访问同一个文件。之后,文件锁定和同步可能会发挥作用。
[rereded -抱歉误解了这个问题,你不能作为进程不共享相同的内存空间。]最好在fork之前打开文件描述符或使用其他IPC机制[/p]
子进程将继承父进程的文件描述符,因此可以直接使用。
void example()
{
int fd = open("My file", O_WRONLY );
pid_t pid = fork();
if(pid == 0)
{
/* child */
char * child_msg = "Hi there from childn";
write(fd, my_msg, sizeof(my_msg);
/* ... other stuff */
}
else
{
/* parent */
char * parent_msg = "Hi there from parentn";
write(fd, my_msg, sizeof(my_msg);
/* ... other stuff */
}
}
两个消息都将写入"my file"
你的问题不清楚。
无论如何,如果你试图在使用父进程的子进程中使用数据,你可以将数据从父进程传输到子进程。为了简化,只需在POSIX int pipe(int anFD[2])
中使用匿名管道,然后您可以使用write
和read
(fread
和fwrite
函数)。在父进程中,您必须使用popen
函数来打开具有写/读访问权限的文件。
请记住,fork()
执行完整复制(父级和子级具有共享页面并且这些页面是只读的)。