本文介绍了waitpid函数,WNOHANG和SIGCHLD实例的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要 waitpid函数 WNOHANG 的例子, SIGCHLD 组合在C,以及如何使用它们所有脱颖而出\\背景是什么?

 信号(SIGCHLD,SIG_IGN); waitpid函数(儿童,状态,0);


解决方案

从http://voyager.deanza.edu/~perry/sigchld.html

 的#include<&stdio.h中GT; / ************处理SIGCHLD! ****************** /
#包括LT&;&signal.h中GT;
#包括LT&;&unistd.h中GT;
#包括LT&;&stdlib.h中GT;
#包括LT&; SYS / wait.h> / *****对于waitpid函数。 ***** /
#包括LT&;&SETJMP.H GT; / *****对于此时sigsetjmp和siglongjmp。 ***** /sigjmp_buf ENV;
主要()
{
    将为pid_t PID;
    INT N = 20;
    结构sigaction的SA;
    无效delete_zombies(无效);    sigfillset(安培; sa.sa_mask);
    sa.sa_handler = delete_zombies;
    sa.sa_flags = 0;
    的sigaction(SIGCHLD,&安培; SA,NULL);    此时sigsetjmp(ENV,1);
    如果((PID =叉())℃,)
    {
        PERROR(坏叉!);
        出口(1);
    }    如果(PID大于0)/ *****父***** /
    {
         的printf(创建子%ld的\\ n,PID);
         睡眠(N - = 2);
         杀(0,SIGKILL);
    }
    否则/ ***** *****儿童/
    {
         睡眠(2);
         出口(0); / ******这里没有必要,但... ****** /
    }
}
无效delete_zombies(无效)
{
    将为pid_t kidpid;
    INT状态;    的printf(内部僵尸的删除:);
    而((kidpid = waitpid函数(-1,&放大器;状态,WNOHANG))大于0)
    {
         的printf(儿童%LD终止\\ n,kidpid);
    }
    siglongjmp(ENV,1);
}

I need an example of waitpid, WNOHANG and SIGCHLD combined in C, and how I can use them all with fore\background?

 signal( SIGCHLD, SIG_IGN );

 waitpid(child, status, 0);
解决方案

Taken from http://voyager.deanza.edu/~perry/sigchld.html

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

这篇关于waitpid函数,WNOHANG和SIGCHLD实例的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-22 10:48