首页 > 系统相关 >Linux多进程06-进程退出、孤儿进程、僵尸进程

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

时间:2023-05-17 18:47:33浏览次数:32  
标签:06 int printf pid getpid Linux 进程 include

进程退出

#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;
}

标签:06,int,printf,pid,getpid,Linux,进程,include
From: https://www.cnblogs.com/anqwjoe/p/17409727.html

相关文章

  • Linux多进程05-exec函数族
    execl:执行文件函数#include<unistd.h>intexecl(constchar*pathname,constchar*arg,...); 执行参数path字符串所代表的文件路径参数:-path:需要指定的执行的文件的路径或者名称(推荐使用绝对路径)-arg:是执行可......
  • Linux多进程07-wait和waitpid
    进程回收在每个进程退出的时候,内核释放该进程所有的资源、包括打开的文件、占用的内存等。但是仍然为其保留一定的信息,这些信息主要主要指进程控制块PCB的信息(包括进程号、退出状态、运行时间等)。父进程可以通过调用wait或waitpid得到它的退出状态同时彻底清除掉这个进程。......
  • Linux多进程09-匿名管道实现ps aux
    /*实现psaux|grepxxx父子进程间通信子进程:psaux,子进程结束后将数据发送给父进程父进程:获取到数据,guolvpipe()execlp()子进程将标准输出stdout_fileno重定向到管道的写端dup2()*/#include<stdio.h>#include<stdlib.......
  • Linux多进程08-进程间通信与管道
    进程间通信进程是一个独立的资源分配单元,不同进程(这里所说的进程通常指的是用户进程)之间的资源是独立的,没有关联,不能在一个进程中直接访问另一个进程的资源。不同的进程需要进行信息的交互和状态传递(如:数据传输/通知事件/资源共享/进程控制),因此需要进程间通信(IPC:Int......
  • Linux多进程11-内存映射
    内存映射(Memory-mappedI/O)是将磁盘文件的数据映射到内存,用户通过修改内存就能修改磁盘文件。mmap#include<sys/mman.h>void*mmap(void*addr,size_tlength,intprot,intflags,intfd,off_toffset);功能:将一个文件或者设备的数据映射到内存中参数:......
  • Linux多进程10-有名管道实现简单版聊天功能
    chatA.c//有名管道实现简单版聊天功能#include<unistd.h>#include<stdio.h>#include<sys/types.h>#include<sys/stat.h>#include<stdlib.h>#include<fcntl.h>#include<string.h>intmain(intargc,charconst*argv[]){......
  • Linux多进程13-kill,raise,abort函数
    #include<sys/types.h>#include<signal.h>intkill(pid_tpid,intsig);-功能:给某个进程pid,发送某个信号sig-参数:-pid:>0:将信号发送给指定的进程=0:将信号发送给当前的进程组=-1:将信号发送给每一个......
  • Linux多进程12-信号
    信号概念信号是Linux进程间通信的最古老的方式之一,是事件发生时对进程的通知机制,有时也称之为软件中断,它是在软件层次上对中断机制的一种模拟,是一种异步通信的方式。信号可以导致一个正在运行的进程被另一个正在运行的异步进程中断,转而处理某一个突发事件。发往进程的诸多信......
  • Linux多进程01-进程概述
    程序与进程程序是包含一系列信息的文件,这些信息描述了如何在运行时创建一个进程进程是正在运行的程序的实例。是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。......
  • linux-ubuntu安装 lrzsz
    ubuntu安装lrzsz方法1:二进制包自动安装sudoapt-getinstalllrzsz方法2:源码包手动安装2.1下载cd/server/toolswgethttps://www.ohse.de/uwe/releases/lrzsz-0.12.20.tar.gztar-xzflrzsz-0.12.20.tar.gzcdlrzsz-0.12.20./configure--prefix=/usr/local/lrzszs......