11.创建子进程(续)、进程的终止

本文详细探讨了进程的创建,特别是子进程与父进程的关系。重点讲解了孤儿进程和僵尸进程的概念,并通过示例展示了如何观察孤儿进程的ppid变化。此外,文章还介绍了进程的正常和异常终止,包括exit、_exit和_Return函数的作用,以及信号在进程终止中的角色。
摘要由CSDN通过智能技术生成

创建子进程(续)

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函数返回后,系统内核会将父进程维护的文件描述符表也复制到子进程的进程表项中,但并不复制文件表象。

        父进程打开了一个文件,有一个文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值