fork和getpid的返回值
最近把之前学的忘了一点,这两个函数的返回值没分清。探究了一下,把收获在这里总结分享一下。
fork
如果我们把程序一行一行地运行过程比作一个人在走路的话,那么没有fork的程序是一个人独自前行。
当这个人遇见了fork()的时候,ta当前的时空就会被复制一份,成为一个当下的平行时空,一起向未来发展(这里的时空,只由两部分组成:那个人和ta脚下的路)。
如果说平行时空的存在令人震撼,那么创造平行时空的人就是更强大的存在了。(以下用“宇宙”代替“时空”。)
为了操纵已有的和新创造出的宇宙,在每次复制宇宙时,都为它们标上记号——“旧宇宙”与“新宇宙”。
fork,这个用来复制时空的操作,用它的返回值告诉我们,谁是“新宇宙”(返回值为0),谁是“旧宇宙”(返回一个大于0的值,具体含义稍后说。NO🙅,我要直接看具体含义)
getpid
有时,在一次路途中,需要许多次宇宙的复制,仅仅用“新旧”两种记号显然不够。我们需要一种能容纳更多不同种宇宙的记号制度。正整数就很合适,从0开始乃至6160117都可以,绝对够用。
所以宇宙的创造者和管理者们,就用类似的序号来区分它们。
getpid(Get Process ID)返回的就是这个序号——进程id,它是和系统所有进程放在一起编的号。
回溯:fork返回值含义
之前说fork返回0代表“新宇宙”(子进程),返回的代表“旧宇宙”(父进程)的那个大于0的值,就是对应子进程的进程id。
总结
. | 子进程 | 父进程 |
---|---|---|
fork返回值 | 0 | 对应子进程的进程id |
getpid返回值 | 进程id | 进程id |
代码示范
int i;
for (i = 0; i < 3; ++i) {
int a = fork();
if (a == 0) { // 子进程
printf("[第%d次循环]子进程: fork=%d\t pid=%d\t ppid=%d\n", i, a,
getpid(), getppid());
} else { // 父进程
wait(); // 等待对应子进程结束
printf("[第%d次循环]父进程: fork=%d\t pid=%d\t ppid=%d\n", i, a,
getpid(), getppid());
exit(0);
}
}
运行结果