【发布时间】:2020-02-19 14:43:51
【问题描述】:
我正在学习多进程,知道使用fork()创建子进程时,子进程获取父进程栈、数据、堆和文本段的副本。
那么为什么下面这段代码不打印两个“hello”呢?
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
static int idata = 111; /* Allocated in data segment */
int main(int argc, char *argv[])
{
int istack = 222; /* Allocated in stack segment */
pid_t childPid;
idata *= 2;
istack *= 2;
printf("hello\n");
switch (childPid = fork()) {
case -1:
printf("fork fail\n");
exit(0);
case 0:
idata *= 3;
istack *= 3;
break;
default:
sleep(3); // Give child a chance to execute
break;
}
/* Both parent and child come here */
printf("PID=%ld %s idata=%d istack=%d\n", (long) getpid(),
(childPid == 0) ? "(child) " : "(parent)", idata, istack);
exit(0);
}
结果是
你好
PID=591(子)idata=666 istack=1332
PID=590(父)idata=222 istack=444
为什么这段代码不打印两个“hello”?
【问题讨论】:
-
子进程从调用
fork的行开始执行 -
程序打印“hello”然后分叉。父母和孩子都不会重置为较早的代码;他们都从分叉继续。
标签: c linux process multiprocessing