我想从父级创建 N 个子级。我希望所有的孩子同时开始(一个功能 - 测量时间)。因此,我将该函数放入信号处理程序中,当父级完成创建(分叉)所有子级时,它会向所有子级发送信号(使用kill(children_id))以让 make 开始。代码如下,但它没有按预期工作。具体来说,它分叉了所有子项,但根本不执行函数“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);
}
子级被创建,设置处理程序,然后立即退出(即死亡)。让他们睡觉或挡住某些东西,这样父母就有时间传递信号。
Update
#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);
}
所有进程和线程都受操作系统调度程序的影响。在您的初始代码中,孩子们and父进程可能会在您希望发生的一系列事件发生之前终止。在父母发出信号之前,孩子们可能会死亡;父进程可以在子进程设置其处理程序之前发送信号(SIGUSR1 会终止进程,因为这是没有处理程序时的默认设置)。执行所有这些操作所需的代码非常少,这一切都在几毫秒内完成,比任何这些进程计划运行的时间都短(因此设置足以满足您的期望)。我添加了一些sleep
给这一切一些喘息的空间和wait
所以父母不会死。这应该可以让您了解它是如何工作的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)