kill()使用C中的混淆

时间:2015-12-16 02:58:25

标签: c multiprocessing signals kill kill-process

我已经阅读了kill手册,我知道这是一个发送信号的系统调用。我编写了一个简单的多进程代码,如果它捕获指定的信号,每个子进程都将执行处理函数,这是我代码中的SIGUSR1。

在我的代码中,我已经制作了3个进程,如果它们捕获SIGUSR1信号,每个进程将打印出“yo”,但输出只打印出一次或两次..?这真让我感到困惑,谢谢你的帮助!

这是我的代码:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <time.h>
#include <signal.h>
#include <sys/time.h>
#include <string.h>
#define N 3 
int pid_id[N];

void handler (int signum)
{
    printf("yo\n");
}

void child(int process_index)
{
    struct sigaction sa;

    /* Register */
    memset(&sa, 0, sizeof(sa));
    sa.sa_handler = handler;
    sigaction(SIGUSR1, &sa, NULL);

    printf("I am %d.\n", getpid());
    pid_id[process_index] = getpid();
    sleep(5);

    exit(0);
}

int main()
{
    int i, status;
    pid_t pid[N];
    pid_t pid_wait;

    for (i=0;i<N;i++)
    {
        pid[i] = fork();
        if (pid[i]==0)
        {
            child(i);
        }
    }


    for (i=0;i<N;i++)
        kill(pid_id[i], SIGUSR1);

    for (i=0;i<N;i++)
    {
        do
        {
            pid_wait = waitpid(pid[i], &status, WNOHANG);
        }while(pid_wait != pid[i]);

    }
    printf("all done\n");

    return 0;
}

1 个答案:

答案 0 :(得分:2)

请记住,您现在正在处理多个流程。只是因为在代码中,您似乎在child之前运行kill并不意味着它按顺序发生。执行顺序完全取决于操作系统如何为这些过程调度CPU时间。

正在发生的事情是某些子进程在安装其信号处理程序之前被杀死。这是一个竞争条件的例子,就像你开始新线程时得到的那种。

这可以通过将父级与其子级同步来解决,这样它就不会继续,直到所有子级都通知他们已完成必要的初始化步骤。