【发布时间】:2019-11-17 06:30:03
【问题描述】:
根据我读到的关于fork() 系统调用的内容
fork系统调用用于创建一个新进程,称为子进程,与父进程并发运行
创建新的子进程后,两个进程都会执行fork()系统调用之后的下一条指令
fork()向子进程返回0
fork()将新建子进程的进程ID返回给父进程(正值)
fork()子进程创建失败返回负值
在这段代码中
void foo() {
if (fork() == 0)
printf("Hello from Child!\n");
else
printf("Hello from Parent!\n");
}
int main() {
foo();
return 0;
}
输出是
Hello from Parent!
Hello from Child!
当控件在主进程函数foo的if-else条件内时创建子进程。
那么子进程是从哪里(哪条指令)开始执行的?
从输出中可以看出,Hello from Parent 在fork() 返回0 时打印。所以据我了解Hello from Parent实际上是由子进程打印的
fork()向父进程返回一个正值,父进程打印Hello from Child。我对此的理解正确吗?
子进程究竟是从哪条指令开始执行的?对fork() 的函数调用是在if-else 的条件部分中给出的。所以孩子应该在那之后开始执行if-else,但这不是正在发生的事情吗?
【问题讨论】:
-
子进程在调用
fork()后立即启动。在您的示例中,子进程还运行 if-else 语句。Hello from Child!是由子进程打印的,因为对于子进程,fork()的返回值为 0。Hello from Parent!由父进程打印,因为fork()返回子进程的 PID id(如果有错误,则返回 -1)。 -
您可以将 fork 视为一个返回两次的调用,一次在父进程中,一次在作为副本的新子进程中。
标签: c fork system-calls