我想要vfork()
一个子进程,但它stdout
与父进程不同stdout
。
实现这一点的明显方法fork()
是在分叉后在子级中dup2()
(和close()
原始文件描述符)。
假设我在调用之前准备好文件描述符,vfork()
并且只需要在调用exec*()
函数之前调用这两个系统调用。我可以这样做吗?
我想要vfork()
一个子进程,但它stdout
与父进程不同stdout
。
实现这一点的明显方法fork()
是在分叉后在子级中dup2()
(和close()
原始文件描述符)。
假设我在调用之前准备好文件描述符,vfork()
并且只需要在调用exec*()
函数之前调用这两个系统调用。我可以这样做吗?
我的答案可能是肯定的。
根据 Linux 手册,对 vfork() 的调用等效于调用 clone(2),其标志指定为:
CLONE_VM | CLONE_VFORK | SIGCHLD
克隆(2)的注释:
CLONE_FILES (Linux 2.0 起) 如果设置了 CLONE_FILES,调用进程和子进程共享同一个文件描述符表。调用进程或子进程创建的任何文件描述符在其他进程中也有效。类似地,如果一个进程关闭了一个文件描述符,或者改变了它的相关标志(使用 fcntl(2) F_SETFD 操作),另一个进程也会受到影响。
If CLONE_FILES is not set, the child process inherits a copy of all file descriptors opened in the calling process at the time of clone(). (The duplicated file descrip‐
tors in the child refer to the same open file descriptions (see open(2)) as the corresponding file descriptors in the calling process.) Subsequent operations that open or
close file descriptors, or change file descriptor flags, performed by either the calling process or the child process do not affect the other process.
所以在vfork之后,子进程中的文件操作默认是隔离的。