c-在子进程中的信号处理程序得到服务后,通知父进程子进程get信号



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

void childProcess()
{
    int h =0 ;
    for(h=0;h<10;h++)
    {
        printf("child for loop running %dn",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 %sn",strsignal(signum));
    printf("%dn",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 %sn",strsignal(signum));
    for(j=0;j<addrLen;j++)
    {
        printf("%u : %sn",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 %dn",getpid());
            registerSignals();
            childProcess();
        }
        else
        {
            printf("parent process id is %dn",getpid());
            // parent
            int iStatus;
            pid_t childPID = waitpid(pid,&iStatus,0);
            printf("iStatus is %dn",WIFEXITED(iStatus));
            if(childPID == -1)
            {
                printf("wait pid failedn");
            }
            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 %sn",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 : %dn",h);
            }
        }
        printf("while loop executing with pid : %d n", getpid());
        sleep(1);
    }
}

我的要求是在子进程中提供信号处理程序之后父进程应该打印"子进程异常终止!!",但我是正在获取"child exit normally!"消息

来自wait()的Linux文档:

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

子信号处理程序使用exit()结束进程,因此一切都按指定方式进行。

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


信号处理程序内部对raise()的调用很可能会导致递归调用,因此remove也是如此。

最新更新