- demo1
- 代码
- 状态变迁
- demo2
- 代码
- 输出到stdout
- 使用管道
demo1
代码
#include <pthread.h>
#include <iostream>
#include <unistd.h>
int main(int argc, char const *argv[]) {
// 1.
pid_t x = fork();
// 2.
pid_t y = fork();
// 3.
printf("%d %d\n", x, y);
return 0;
}
状态变迁
最终程序运行的结果就是叶子结点的进程并发执行最后一条printf
的结果
demo2
代码
#include <iostream>
#include <unistd.h>
int main(int argc, char const *argv[]) {
fork();
printf("Hello\n");
fork();
printf("Hello\n");
return 0;
}
输出到stdout
终端默认使用行缓冲, 读到换行时就清空缓冲区并将缓冲区内容写到终端
./a.out
结果: 6个Hello
Hello
Hello
Hello
Hello
Hello
Hello
状态迁移图
使用管道
./a.out | cat
结果: 8个Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
原因
当stdout重定向时, 使用全缓冲. printf("Hello\n");
只是将Hello通过write写到缓冲区, 并没有打印, 直到进程结束时才清空缓冲区打印
进程状态迁移图