首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在为子进程中的信号处理程序提供信号处理后,通知父进程有关子进程获取信号的信息

在为子进程中的信号处理程序提供信号处理后,通知父进程有关子进程获取信号的信息
EN

Stack Overflow用户
提问于 2016-04-11 10:30:04
回答 1查看 762关注 0票数 1

目前,我正在子进程的信号处理程序中收集子进程的回溯。然后计划使用消息队列将收集到的回溯发送到父进程。我的问题是当子进程收到任何信号。子信号处理程序运行,但通知父进程子进程正常退出,而不是子进程获取信号。下面是我的代码

代码语言:javascript
复制
void childProcess()
{
    int h =0 ;
    for(h=0;h<10;h++)
    {
        printf("child for loop running %d\n",h);
        //sleep(1);
        int q = 1/0; // generate floating point exception
    }

    exit(0);
}



void signalhandler(int signum, siginfo_t *si, void *arg)
{
    printf("signal received %s\n",strsignal(signum));
    printf("%d\n",signum);
    void *array[100];
    int size = 100;
    int addrLen = backtrace(&array,size);
    char ** sym = backtrace_symbols(&array,addrLen);
    int j = 0;
    printf("Test crashed due to %s\n",strsignal(signum));
    for(j=0;j<addrLen;j++)
    {
        printf("%u : %s\n",array[j],sym[j]);
    }
    raise(signum);             
    exit(signum);
}

void registerSignals()
{

    struct sigaction sa;
    memset(&sa, 0, sizeof(sa));
    sigemptyset(&sa.sa_mask);
    sa.sa_sigaction = signalhandler;
    sa.sa_flags = SA_SIGINFO;

    sigaction(SIGSEGV, &sa, NULL);       
    sigaction(SIGFPE, &sa, NULL);

}

int main()
{
    //while(1)
    {
        pid_t pid;
        pid = fork();
        if(pid == 0)
        {
            // child
            printf("child process id is %d\n",getpid());
            registerSignals();
            childProcess();
        }
        else
        {
            printf("parent process id is %d\n",getpid());
            // parent
            int iStatus;
            pid_t childPID = waitpid(pid,&iStatus,0);
            printf("iStatus is %d\n",WIFEXITED(iStatus));
            if(childPID == -1)
            {
                printf("wait pid failed\n");
            }
            else if(WIFEXITED(iStatus)==1)
            {
                printf("child exited normally!\n");
            }
            else if (WIFSIGNALED(iStatus)==1)
            {
                printf("child process terminated abnormally !!\n");
                int iSignalnumber = 0;
                // to fetch the signal number
                iSignalnumber = WTERMSIG(iStatus);
                printf("child process terminated due to %s\n",strsignal(iSignalnumber));
                // to check core file is generated or not
                if(WCOREDUMP(iStatus)==1)
                {
                    printf("core file is generated \n");
                }
                else
                {
                    printf("core file is not generated \n");
                }
            }
            int h ;
            for(h = 0; h<10;h++)
            {
                printf("parent executing : %d\n",h);
            }
        }
        printf("while loop executing with pid : %d \n", getpid());
        sleep(1);
    }

}

我的要求是在子进程中服务信号处理程序后,父进程应该打印“子进程异常终止!”但我要“正常地离开孩子!”消息

EN

回答 1

Stack Overflow用户

发布于 2016-04-11 10:46:56

来自's Linux docs

如果子程序正常终止,即通过调用exit(3)或_exit(2)或从main()返回,则WIFEXITED(wstatus)返回true。

子信号处理程序使用exit()结束进程,因此所有操作都是指定的。

从信号处理程序中删除对exit()的调用,以获得预期的结果。

信号处理程序中对raise()的调用很可能导致递归调用,因此删除也是如此。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36546140

复制
相关文章

相似问题

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