Linux多进程06-进程退出、孤儿进程、僵尸进程

进程退出

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

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

image

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

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

    status 参数: 进程退出时一个状态信息,父进程回收子进程资源时可以获得
*/

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

int main(int argc, char const *argv[])
{
    printf("hello\n");
    printf("world");
    // exit(0); //刷新IO缓存,会打印world 
    _exit(0); //不会刷新缓冲区,因此不打印world

    return 0;
}

孤儿进程

父进程运行结束,但子进程还在运行(未运行结束),这样的子进程就称为孤儿进程(Orphan Process)。

每当出现一个孤儿进程的时候,内核就把孤儿进程的父进程设置为 init ,而 init进程会循环地 wait() 它的已经退出的子进程, 因此孤儿进程并不会有什么危害。

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

int main(int argc, char const *argv[])
{
    //创建子进程
    pid_t pid = fork();

    //判断是父进程还是子进程
    if (pid > 0)
    {
        printf("i am a parent process, pid: %d, ppid: %d\n", getpid(), getppid());
    }
    else if (pid == 0){
        sleep(1);
        printf("i am a child process, pid: %d, ppid: %d\n", getpid(), getppid());
    }

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

    return 0;
}

僵尸进程

  • 进程结束后会释放自己地址空间中用户区数据, 但内核区的PCB需要父进程来释放
  • 进程终止, 父进程尚未回收,子进程残留资源(PCB)存放于内核中,变成僵尸(Zombie)进程
  • 僵尸进程不能被 kill -9 杀死,如果父进程不调用 wait() 或 waitpid() 的话,那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵尸进程,将因为没有可用的进程号而导致系统不能产生新的进程
//子进程只能自己释放掉用户区的数据,但无法释放内核区的数据,
//进程结束了还占用着进程号,成为了僵尸进程
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

int main(int argc, char const *argv[])
{
    //创建子进程
    pid_t pid = fork();

    //判断是父进程还是子进程
    if (pid > 0)
    {
        while (1)
        {
            printf("i am a parent process, pid: %d, ppid: %d\n", getpid(), getppid());
            sleep(1);
        }
    }
    else if (pid == 0)
    {
        printf("i am a child process, pid: %d, ppid: %d\n", getpid(), getppid());
    }

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

    return 0;
}

本文作者:言叶以上

本文链接:https://www.cnblogs.com/anqwjoe/p/17409727.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   言叶以上  阅读(26)  评论(0编辑  收藏  举报
历史上的今天:
2018-05-17 Vue.js 基础知识
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起