У меня есть следующий код, в котором родитель создает несколько дочерних процессов и впоследствии их убивает. Однажды убитый, я хочу напечатать то, что убило ребенка (сигнал в этом случае). Однако код не печатает это. В чем проблема?Как заставить ребенка печатать сигнал, который его убил?
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
int i;
static void signal_handler(int signo)
{
if (signo == SIGUSR1)
{
printf("child %d received sigusr1\n", i + 1);
}
}
int main(void)
{
char buff[50];
int status;
if (signal(SIGUSR1, signal_handler) == SIGUSR1)
{
perror("Signal handling error");
}
pid_t cpid, count;
for (i = 0; i < 5; i++)
{
cpid = fork();
if (cpid == 0)
{
sleep(10);
//exit(0);
}
else if (cpid > 0)
{
kill(cpid, SIGUSR1);
int status;
int n = waitpid(cpid, &status, 0);
if (n != cpid)
{
perror("error");
}
if (WIFSIGNALED(status))
{ /* get WTERMSIG(status) */
printf("killed by signal=%d\n", WTERMSIG(status));
}
}
else
{
perror("Fork error: ");
exit(1);
}
}
}
Ну, я думаю, что дети заканчиваются с выходом (0) до того, как сигнал смерти от родителя прибывает. Следует держать детей в живых, например. с sleep(), чтобы они все еще находились вокруг сигнала SIGUSR. – user422005
Я пробовал это, но его еще не печатал эту часть: printf («убит сигналом =% d \ n»); WTERMSIG (статус); – user3015353