Я новичок в Linux и IPC, поэтому, пожалуйста, потерпите меня. Я застрял в задаче домашнего задания, где мне нужно создать систему двусторонней связи, а именно:
1. Parent sends SIGUSR1 to multiple (1 to 10) children
2. Children all respond with SIGUSR2 to parent
3. If all SIGUSR2 signals are collected, parent pauses for 1 second
4. Repeat from [1], until SIGTERM is sent to parent
В настоящее время я просто пытаюсь заставить это работать только с одним ребенком, и мне нужноиспользовать функции Parent .. и ChildHandler для обработки полученных сигналов.
Я попытался отправить начальный SIGUSR1 дочернему элементу, а затем с помощью ChildHandler kill (getppid (), SIGUSR) родительскому элементу,но это не работает, как я ожидал. ChildHandler, похоже, не получает сигнал до того, как родитель начинает ждать.
ParentHandler (int signo) :
if (signo == SIGUSR2)
{
printf("P received SIGUSR2\n");
printf("Waiting for %d sec...\n\n", WAIT_TIME);
sleep(WAIT_TIME);
return;
}
else
{
printf("Something went wrong in PH...\n\n");
exit(1);
}
ChildHandler (int signo) :
if (signo == SIGUSR1)
printf("C received SIGUSR1\n");
kill(getppid(), SIGUSR2); // P <--SIGUSR2--- C
return;
Main :
pid_t pid, ppid;
ppid = getpid();
// Subscribe parent to SIGTERM
// signal(SIGTERM, SigTermParentHandler);
// Parent <--> Child dialogue
if ((pid = fork()) != 0) // Parent
{
printf("P: %d | C: %d\n\n", ppid, pid);
if (signal(SIGUSR2, ParentHandler) == SIG_ERR)
printf("SIGUSR2 to parent was interrupted!");
while (1)
{
printf("P ---SIGUSR1--> C\n");
kill(pid, SIGUSR1); // P ---SIGUSR1--> C
}
}
else // Child
{
sleep(WAIT_TIME); // Wait for parent to finish setting up
if (signal(SIGUSR1, ChildHandler) == SIG_ERR)
printf("SIGUSR1 to child was interrupted!");
}
Я ожидаю, что результат будет примерно следующим:
Parent PID is: 13918
P: 13918 | C: 13919
P ---SIGUSR1--> C
C received SIGUSR1
P <--SIGUSR2--- C
P received SIGUSR2
Waiting for 1 sec...
P ---SIGUSR1--> C
...