如果我在父进程中调用fork()会发生什么?
一般例子:
int ret;
int fd[2];
ret = pipe(fd);
pid = fork();
if (pid == -1){
perror("fork failed");
exit(1);
}
else if (pid > 0){ //PARENT
//writes or reads
fork();
}
这是否意味着fork()将创建父进程的新进程?
我对此很新,所以非常感谢帮助。感谢。
答案 0 :(得分:1)
如果我在父进程中调用fork()会发生什么?
您调用fork()
的每个流程都可以被视为父流程。
来自Linux手册页fork(2)
:
fork() creates a new process by duplicating the calling process. The
new process, referred to as the child, is an exact duplicate of the
calling process, referred to as the parent, except for the following
points:
* The child has its own unique process ID, and this PID does not
match the ID of any existing process group (setpgid(2)).
* The child's parent process ID is the same as the parent's process
ID.
...
fork()
的结果是原始进程运行的两个相同副本。最初调用fork()
的人是父,结果进程是子。子的PPID(父进程ID)等于父进程的PID。
original process
|
| fork() called
|\
| \
| \
| \
parent child
答案 1 :(得分:1)
每当你打电话给fork
时,它会“返回两次” - 一次在父母身份,一次在孩子身上。该描述中的术语“父母”和“儿童”主要是为了便于消除歧义。 (虽然当您开始讨论waitpid
时会有一些差异。)它们都是“非常好的流程”,可以继续fork
其他流程,或exec
,或者只是两人都继续以愉快的方式做一些完全不同的事情。
在你的例子中,让我们假设我们从一个带有pid 1的进程开始。这是我尝试发生的事情的图表,因为不支持表:\
fork
返回2. else if
,这是真的。我们再次致电fork
。创建了流程3. fork
返回3. fork
返回0. fork
返回0. else if
,这是假的。所以你最终得到3个过程;进程1是2和3的父进程。这三个中的任何一个都可以再次进入fork
,创建更多的子进程等等。
答案 2 :(得分:0)
这是否意味着fork()将创建父进程的新进程?
fork()
创建一个新进程,其内存与调用它的内存重复(尽管不是共享)。
请记住,流程形成了一个树,其中每个连续的流程都是它所分叉的子(父)。