【Linux】进程退出、孤儿进程、僵尸进程

橙色

01、进程退出

由下图可以看出,标准c库的exit函数比Linux的系统函数_exit多做了两件事情。
在这里插入图片描述

执行如下的代码,可得结果如下图,可以看到,hello和world都被打印了出来,但因为world后面没有换行符,所以world后面紧跟了新的命令行。

/*
    #include <stdlib.h>
    void exit(int status);

    #include <unistd.h>
    void _exit(int status);

    status参数:是进程退出时的一个状态信息。父进程回收子进程资源的时候可以获取到。
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {

    printf("hello\n");
    printf("world");

    exit(0);
    // _exit(0);
    
    return 0;
}

在这里插入图片描述

而如果使用上述代码中第二个带下划线的exit,则会得到如下结果,只打印了hello而没有打印world。为什么会这样呢?因为printf是c语言标准库函数,hello后面跟有换行符\n,所以会自动刷新I/O缓冲区,输出hello。但world后面没有换行符,所以world在被送入I/O缓冲区后,因为上面提到了_exit()函数停止进程并不会刷新I/O缓冲区,所以world没有被打印出来
在这里插入图片描述

02、孤儿进程

在这里插入图片描述

为什么要设置为init呢?因为父进程有义务在子进程结束后回收子进程

下面来演示一下子进程,代码及结果图如下

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

int main() {

    // 创建子进程
    pid_t pid = fork();

    // 判断是父进程还是子进程
    if(pid > 0) {

        printf("i am parent process, pid : %d, ppid : %d\n", getpid(), getppid());

    } else if(pid == 0) {
        sleep(1);
        // 当前是子进程
        printf("i am child process, pid : %d, ppid : %d\n", getpid(),getppid());
       
    }

    // for循环
    for(int i = 0; i < 3; i++) {
        printf("i : %d , pid : %d\n", i , getpid());
    }

    return 0;
}

在这里插入图片描述
为什么i am child会出现在前台呢?因为系统默在处理进程时会切换到后台,处理完进程后就会返回前台,没想到还有一个孤儿进程继续在执行,所以就出现了打印的语句在前台的情况。

03、僵尸进程

在这里插入图片描述

wait()函数和waitpid()函数会在下一张中介绍。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力学习的小马

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值