我有这个代码:
int main(void)
{
int f;
for (int i = 0; i < 2; i++)
{
fork();
printf("hello\n");
}
wait(NULL);
printf("hello\n");
exit(0);
}
当我在终端中运行这段代码时,我会得到 10 行“hello”。
但是在将输出重定向到一个文件之后:
./test > file.txt
我在文件中得到 12 行“hello”。
为什么会有这种差异?
因为你只是做
fork
但不检查返回值(0执行子代码),你分叉比你想象的更多孩子。
父母也做
printf
和not只是孩子。
并且,在第一个循环之后,第一个孩子also做了一个
fork
所以你有一个意想不到的孙子。
它也像父母和孩子一样,都打印出来。
所以,你从循环中得到 six 打印。
而且,因为有no
exit
调用在孩子们,他们“落空”并执行底部的父代码。
所以,在循环之后,你从代码中得到four打印。
而且,你应该在wait
上
loop因为你
fork
two孩子但只做一个singlewait
.
添加一些
getpid
和 getppid
电话可以显示真正发生的事情:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#define PRINT(_fmt) \
printf("%d/%d " _fmt,getpid(),getppid())
int
main(void)
{
int f;
setlinebuf(stdout);
for (int i = 0; i < 2; i++) {
fork();
PRINT("hello\n");
}
wait(NULL);
PRINT("world\n");
exit(0);
}
这里是输出:
242293/2809616 hello
242293/2809616 hello
242294/242293 hello
242294/242293 hello
242295/242293 hello
242295/242293 world
242296/242294 hello
242296/242294 world
242293/2809616 world
242294/2806078 world
这里是更正后的程序:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#define PRINT(_fmt) \
printf("%d/%d " _fmt,getpid(),getppid())
int
main(void)
{
int f;
setlinebuf(stdout);
for (int i = 0; i < 2; i++) {
if (fork() == 0) {
PRINT("hello\n");
exit(0);
}
}
while (wait(NULL) >= 0);
PRINT("world\n");
exit(0);
}
程序输出如下:
242316/242314 hello
242315/242314 hello
242314/2809616 world