首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >waitpid、WNOHANG和SIGCHLD示例

waitpid、WNOHANG和SIGCHLD示例
EN

Stack Overflow用户
提问于 2011-08-23 10:50:48
回答 1查看 41.9K关注 0票数 9

我需要一个在C中组合使用waitpidWNOHANGSIGCHLD的示例,以及如何在fore\background中使用它们?

代码语言:javascript
复制
 signal( SIGCHLD, SIG_IGN );

 waitpid(child, status, 0);
EN

回答 1

Stack Overflow用户

发布于 2011-08-31 17:29:04

摘自http://voyager.deanza.edu/~perry/sigchld.html

代码语言:javascript
复制
#include <stdio.h>    /************  Handling SIGCHLD!!  ******************/
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>  /*****  For waitpid.                   *****/
#include <setjmp.h>    /*****  For sigsetjmp and siglongjmp.  *****/

sigjmp_buf env;
main()
{
    pid_t pid;
    int n = 20;
    struct sigaction sa;
    void delete_zombies(void);

    sigfillset(&sa.sa_mask);
    sa.sa_handler = delete_zombies;
    sa.sa_flags = 0;
    sigaction(SIGCHLD, &sa, NULL);

    sigsetjmp(env, 1);
    if ((pid = fork()) < 0)
    {
        perror("Bad fork!");
        exit(1);
    }

    if (pid > 0)   /***** Parent *****/
    {
         printf("Created child %ld\n", pid);
         sleep(n -= 2);
         kill(0, SIGKILL);
    }
    else           /***** Child  *****/
    {
         sleep(2);
         exit(0);   /******  Not necessary here but...  ******/
    }
}




void delete_zombies(void)
{
    pid_t kidpid;
    int status;

    printf("Inside zombie deleter:  ");
    while ((kidpid = waitpid(-1, &status, WNOHANG)) > 0)
    {
         printf("Child %ld terminated\n", kidpid);
    }
    siglongjmp(env,1);
}
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7155810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档