int main() { printf("hello world"); fork(); return0; } //输出为hello worldhello world int main() { printf("hello world\n"); fork(); return0; } //输出为hello world
printf是向标准输出(stdout)输出你要打印的东西,而默认的stdout是line buffering,也就是以行方式缓存的,
所以当你打印的东西不够一行(没有\n)的时候,这些信息是保存在stdout的buffer中,然后你fork,
这样父进程和子进程的stdout的buffer就都包含有你没有打印出来的内容,当这两个进程结束的时候,b
uffer中的内容会被打印出来,这样你就看到了两次 hello world. 而第二个程序中,你打印的东西够了一行(有\n结束),
所以在fork之前,信息就被打印出来了,
fork之后父进程和子进程stdout的buffer中都是空的了,
所以你就只看到一次hello world.
解决第一个程序的问题的方法是 printf("hello world"); fflush(stdout); //手动将stdout缓存的内容打印出来。 fork();
这是一个简单的 创建子进程,然后子进程各自运行 的程序
在看之前首先思考3个问题
(1)child1,child2是child的子进程么?
(2)红字部分程序会执行几次?
(3)蓝字部分程序会执行几次?
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
int main(woid)
{
}
最终 红字部分执行了4次,蓝字部分执行了2次
程序本来有一个进程child
这句话创造了1个进程,child的子进程child1
这句话创造了2个进程:
child的另外一个子进程child2;
child1的一个子进程child2(相当于包含了child1的内容)。
因为有4个进程,所以所有不需要条件判断的输出语句都会执行4次
蓝子部分是由child的子进程child1,child1的子进程child2各执行了一次,所以是2次