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

109 阅读1分钟

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()函数会在下一张中介绍。