#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
int main(void)
{
int i;
for (i = 0; i < 2; i++) {
fork();
printf("?"); //hello,world
}
return 0;
}
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
int main(void)
{
int i;
for (i = 0; i < 2; i++) {
fork();
printf("?\n");//hello,world
}
return 0;
}
循环里有fork ,fork 里面有循环 结果是死循环 ,造成stack溢出呀,根本不会输出 在哪里思维停顿了。
点评:
fork的实现分为以下两步
复制进程的资源包括以下几步
fork()系统调用的特性,
你现在任务分析多少个进程,不考虑打印多少?
相同颜色的是同一个进程
相同颜色的是同一个进程
[misaki@localhost test]$ ./main
ppid:2221, pid:4846
ppid:4846, pid:4847
ppid:2221, pid:4846
ppid:4846, pid:4848
ppid:4846, pid:4847
ppid:4847, pid:4849
[misaki@localhost ~]$ pstree -ap misaki
sshd,2220
├─bash,2221
│ └─main,4846(P1)
│ ├─main,4847(P2)
│ │ └─main,4849 P(3)
│ └─main,4848(P4)
└─bash,3571
└─pstree,4850 -ap misaki
当i=1,会继续执行for循环---P2先fork()出一个子进程P3,同时再输出一个'-'。
相同颜色的是同一个进程
## 打印多少?
### 1. 青铜:小王的分析第一次,结果肯定是错误的
> 被多个fork 吓住了,却没想到 块设备 和字符设备的区别?
点评:cout flush函数都不懂,差
- 打印4个 hello
#include <stdio.h> #include <unistd.h> #includeusing namespace std; int main(void) { cout<< "hello" ; fork(); cout<< "hello" ; return 0; }
- 打印3个 hello
#include <stdio.h> #include <unistd.h> #includeusing namespace std; int main(void) { cout<< "hello" << endl; fork(); cout<< "hello" << endl; return 0; }
我们的子进程会复制父进程的缓冲区。
程序遇到“\n”,或是EOF,或是缓冲区满,或是文件描述符关闭,或是主动flush,或是程序退出,就会把数据刷出缓冲区。