c - kill() 在 C 中的用法混淆

标签 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;
}

最佳答案

请记住,您现在正在处理多个进程。仅仅因为在代码中看起来您在 kill 之前运行了 child 并不意味着它按该顺序发生。执行顺序完全取决于操作系统如何为这些进程安排 CPU 时间。

发生的事情是一些子进程在安装信号处理程序之前就被杀死了。这是竞争条件的示例,很像您在启动新线程时遇到的那种情况。

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

关于c - kill() 在 C 中的用法混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34303220/

相关文章:

c - 尝试将不规则数组传递给库 qsort 函数

c++ - 如何使用 CreateProcess 或 ShellExecute 执行管道命令

c - 使用 -D 引用宏预处理器

C 编程 : declaring string and assignment

python - PyQt:激活 QListWidget 项目

python - 在多处理中,每个进程在 CPython 中都有自己的 GIL,这是真的吗?这与创建新的运行时有什么不同?

python - mac 上的多处理导入模块

python - 在单个 GPU 上并行拟合多个 Keras 模型

c - 从子进程获取信号后从共享内存获取数据

Python:获取当前行运行时间