gpt4 book ai didi

c - 让 children 等待直到收到 parent 的信号

转载 作者:太空狗 更新时间:2023-10-29 11:27:25 25 4
gpt4 key购买 nike

我想从一个父节点创建 N 个子节点。我希望所有的 child 同时开始(一个功能——测量时间)。所以我把这个函数放在一个信号处理程序中,当父进程完成创建(fork)所有子进程时,它向所有子进程发送信号(使用 kill(children_id))让 make 开始。代码在下面,但它没有按预期工作。具体来说,它 fork 了所有子节点,但根本不执行函数“measure_time”。这个函数只是记录执行时间并打印出来。如果我做错了什么,有人可以告诉我吗?

    int n_task = 4;
for (i = 0; i < n_task; i++){
pid = fork();
if (pid < 0){
printf("cannot fork!\n");
} else
if (pid == 0){ //child
printf("printed from child [%d]\n", getpid());
signal(SIGUSR1, measure_time); //measure_time is a function
exit(0);
} else {
pid_array[i] = pid;
}
}

//This code is executed from parent only
for (int i = 0; i < n_task; i++)
{
kill(pid_array[i], SIGUSR1);
}

最佳答案

if (pid == 0){ //child
printf("printed from child [%d]\n", getpid());
signal(SIGUSR1, measure_time); //measure_time is a function
exit(0);
}

child 被创建,设置处理程序,并立即退出(即死亡)。让他们 sleep 或挡在某物上,这样 parent 就有时间传递信号。

更新

#define _POSIX_SOURCE

#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>

void measure_time(int sig)
{
printf("child [%d] received signal %d\n", getpid(), sig);
}

int main(int argc, char *argv[])
{
int n_task = 4;

pid_t pid;
pid_t pid_array[n_task];

for (int i = 0; i < n_task; i++)
{
pid = fork();

if (pid < 0)
{
perror("fork");
exit(1);
}

if (pid == 0) //child
{
printf("printed from child [%d]\n", getpid());
signal(SIGUSR1, measure_time); //measure_time is a function
sleep(5);

exit(0);
}

//parent
pid_array[i] = pid;
}

//This code is executed from parent only
sleep(1);

for (int i = 0; i < n_task; i++)
kill(pid_array[i], SIGUSR1);

for (int i = 0; i < n_task; i++)
wait(NULL);

return (0);
}

所有进程和线程都受操作系统调度程序的影响。在您的初始代码中,子级 父级可能会在您希望发生的事件序列发生之前终止。 children 可能在 parent 发出信号之前就死了; parent 可以在 child 设置他们的处理程序之前发送它的信号(并且 SIGUSR1 终止进程,因为在没有处理程序的情况下这是它的默认设置)。执行所有这些的代码非常少,所有这些都在几毫秒内发生,比任何这些进程被安排运行的时间都短(因此设置足以满足您的期望)。我添加了一些 sleep 来给它一些喘息的空间和一个 wait 这样父进程就不会死掉。这应该可以让您了解它是如何工作的。

关于c - 让 children 等待直到收到 parent 的信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19886921/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com