进程waitpid()的用法

代码分析:

/* waitpid.c */
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
    pid_t pc, pr;

    pc = fork();
    if( pc < 0 )
    {
            printf("Error fork\n");
            exit(1);
    }
    else if( pc == 0 )    /* 子进程 */
    {
        /* 子进程暂停5s */
        sleep(5);
        /* 子进程正常退出 */
        exit(0);
    }
    else    /* 父进程 */
    {
        /* 循环测试子进程是否退出 */
        do
        {
            /* 调用waitpid,且父进程不阻塞 */
            pr = waitpid(pc, NULL, WNOHANG);

            /* 若子进程还未退出,则父进程暂停1s */
            if( pr == 0 )
            {
                printf("The child process has not exited\n");
                sleep(1);
            }
        }while( pr == 0 );

        /* 若发现子进程退出,打印出相应情况 */
        if( pr == pc )
        {
            printf("Get child exit code: %d\n",pr);
        }
        else
        {
            printf("Some error occured.\n");
        }
    }
}

时间: 2024-11-03 21:56:44

进程waitpid()的用法的相关文章

进程池的用法

这是一个函数,没有返回值和其他的函数交互的方式 from concurrent.futures import ThreadPoolExecutor import time pool = ThreadPoolExecutor(50) def f1(): print('hello') time.sleep(1) for i in range(200): pool.submit(f1) 要是有函数参数的调用 from concurrent.futures import ThreadPoolExecut

[学习笔记]父进程wait和waitpid

1.wait和waitpid出现的原因 SIGCHLD q  当子进程退出的时候,内核会向父进程发送SIGCHLD信号,子进程的退出是个异步事件(子进程可以在父进程运行的任何时刻终止) q  子进程退出时,内核将子进程置为僵尸状态,这个进程称为僵尸进程,它只保留最小的一些内核数据结构,以便父进程查询子进程的退出状态. 父进程查询子进程的退出状态可以用wait/waitpid函数 2.wait和waitpid函数用法 Wait q  头文件<sys/types.h>和<sys/wait.h

Process用法与进程详解

僵尸与孤儿进程 僵尸进程:父进程的子进程结束的时候父进程没有wait()情况下子进程会变成僵尸进程 孤儿进程(无害) 一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程.孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作. 情况1 无害 父进等着子进程都死,回收僵尸进程. 情况2 无害 父进程死了,子进程活着,都要被init进程接管并且回收. 情况3 有害 父进程一直不死,造成了大量僵尸进程.占用了大量的pid号 pid号是有限的. 解

(49)LINUX应用编程和网络编程之四 Linux进程全解

补充: 1.  C程序的执行过程: C编译器调用链接器,链接器设置可执行程序文件的启动起始地址(启动例程),启动例程获得内核传递来的 命令行参数和环境变量值,为调用main函数做准备.[实际上该启动例程常用汇编语言编写],如果将启动例程换做C语言就是:exit(main(argc,argv)); main(int argc,char *argv[],char *engv[]);argv为指向参数的各个指针所构成的数组. 2.exit做一些清理处理(标准IO库的清理关闭操作为所有打开的流调用fcl

2次使用fork避免产生僵尸进程和不去处理SIGCHLD信号

1.如下代码所示 #include <unistd.h> #include <sys/types.h> #include <unistd.h> int main(int argc,char *argv[]) { pid_t child = fork(); if( child == -1 ) { //error printf("\nfork child error."); exit(0); } else if(child == 0){ //exit(0

CSAPP Lab:Shell Lab——理解进程控制的秘密

本次实验目的是完成一个简单的shell程序,解析命令行参数,理解并使用(fork,execve,waitpid)常见的多进程函数,了解linux进程组,以及前台进程和后台进程的相关概念,理解linux的信号机制(包括发送信号,接受信号,阻塞信号等).实验提示以及详情请阅读CMU的实验指导:http://csapp.cs.cmu.edu/public/labs.html . 我们要完成的shell并不是从0开始,实验本身已经帮你完成了一部分内容,并且提供一些工具函数,我们要做的是实现一下这几个核心

os.waitpid()无法获取sys.exit()退出时的status code

[目的] 父进程使用os.waitpid()等待子进程退出,并检测子进程的exit code,以决定是否重启子进程. (常见的应用场景是:子进程接收外部命令,收到"stop"时退出所有进程,终止服务:收到"restart"时所有子进程退出,父进程重启所有子进程,以达到重启服务的目的). 这里面的关键点在于,子进程退出时设置exit code,父进程waitpid时获取该exit code,进而决定是否需要重启子进程. [问题] 子进程 ...#need restar

linux 僵死进程

僵死进程简而言之就是:子进程退出时,父进程并未对其发出的SIGCHILD信号进行适当处理,导致子进程停留在僵死状态等待其父进程为其收尸,这个状态下的子进程就是僵死进程. 在fork()/execve()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为僵死进程,无法正常结束,此时即使是root身份kill -9也不能杀死僵死进程.补救办法是杀死僵尸进程的父进程(僵死进程的父进程必

linux僵死进程的产生与避免

作者:lingdxuyan来源:ChinaUnix技术博客,本文版权由lingdxuyan所有,如需转载,请注明出处. 一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁, 而是留下一个称为僵死进程(Zombie)的数据结构(系统调用exit,它的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵死进程,并不能将其完全销毁).“僵死进程的产生在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等,但是仍然为其保留一定的信息(包括进程号the pr