子进程通过kill 发送信号造成的父进程 waitpid 返回 -1

Show me the code.

#include 
#include 
#include 
#include 
#include 
#include 

static void handler(int intrSignal) {
    printf("Interrupt Signal: %d \n", intrSignal);
}

static int demo(void) {
    int parentPid = 0, childPid = 0;
    int ret = 0;
    int childStatus = 0;
    struct sigaction sa;

    sa.sa_handler = handler;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = 0;
    sigaction(SIGUSR1, &sa, NULL);

    parentPid = getpid();
    childPid = fork();
    if (0 == childPid) {
        sleep(2);
        kill(parentPid, SIGUSR1);
        sleep(2);
        printf("Child pid will exit.");
        exit(0);
    } else {
        ret = waitpid(childPid, &childStatus, 0);
        printf("ret: %d, childStatus: %d \n", ret, childStatus);

        // ret = waitpid(childPid, &childStatus, 0);
        // printf("ret: %d, childStatus: %d \n", ret, childStatus);
    }

    return 0;
}

int main(void)
{
    demo();
    return 0;
}

输出结果为

$ ./fork 
Interrupt Signal: 10 
ret: -1, childStatus: 0 

$ Child pid will exit.

可以看到waitpid返回值为-1, 这是因为子进程通过kill发送的信号被waitpid收到了,而此时子进程并没有退出。
我能想到的workaround方法就是在waitpid后面再加一个waitpid或者根据childstatus的值来判断子进程的状态。
不知道今后能否想到更好的办法。

你可能感兴趣的:(C语言)