创建子进程(续)
1.子进程是父进程的不完全副本,除了会复制父进程的数据区、BSS区、堆区、栈区、参数和环境变量外,包括输入输出缓冲区也会进行复制。
看看标准输出:
我们给一个printf("hello"),不给\n,会先到标准输出缓冲区的地方,从标准输出缓冲区再到显示器中
回忆标c中,缓冲区中的数据什么时候会到显示器中
a.缓冲区中有\n
b.缓冲区满
c.程序结束
当我们给如下函数并运行时,就会看到没有任何输出,因为不满足任何一项
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <unistd.h>
4
5 int main(void){
6 printf("hello");
7
8 for(;;);
9 return 0
10 }
而后,子进程会复制父进程的缓冲区中内容,则以如下代码显示看看
//子进程会复制父进程的输出缓冲区
#include<stdio.h>
#include<unistd.h>
int main(void){
//setbuf(stdout,NULL);//关闭输出缓冲区
printf("ABC");
pid_t pid = fork();
if(pid == -1){
perror("fork");
return -1;
}
//子进程代码
if(pid == 0){
printf("XYZ\n");
return 0;
}
//父进程代码
sleep(1);
printf("\n");
return 0;
}
因为ABC留存在缓冲区被子进程复制,遇到子进程XYZ\n才被输出出来,所以会是ABCXYZ,而父进程到下边\n才输出出ABC
而当我们将上边代码里setbuf(stdout,NULL);函数注释去掉,这个函数的作用是关闭缓冲区,就不会有这个情况出现了
上述知识其实编写代码是可能一直用不到的,但是可能遇到这种错误,值得注意
2.fork函数返回后,系统内核会将父进程维护的文件描述符表也复制到子进程的进程表项中,但并不复制文件表象。
父进程打开了一个文件,有一个文件