Мне нужно вставить нечетное число терминалом. После этого он генерирует два процесса, A и B. Затем он отправляет сигнал SIGUSR2
в B, а его обработчик выводит обратное значение argv[1]
. Затем B приостанавливается на argv[1]
секунды и отправляет SIGUSR1
сигнал процессу A перед завершением. Обработчик SIGUSR1
для процесса A что-то печатает и затем завершает работу. Проблема в том, что обработчик SIGUSR1
для процесса A не работает, потому что сигнал не может быть отправлен обработчиком SIGUSR2
для процесса B. Фактически, kill(A,SIGUSR1)
говорит, что такого процесса (для процесса A) нет. После установки обработчика сигнала в процессе A он находится в pause()
. Может ли кто-нибудь помочь мне решить? Спасибо.
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
int arg;
int pid1 = 11, pid2 = 12;
void sigusr2Handler1(int);
void sigusr1Handler2(int);
int main(int argc, char* argv[])
{
if(argc != 2){
printf("Usage: %s num(int)\n", argv[0]);
exit(1);
}
arg = atoi(argv[1]);
pid1 = fork();
if (pid1 != 0)
pid2 = fork();
if (arg%2 != 0) {
if (pid1 == 0) {
if (signal(SIGUSR1, sigusr1Handler2) == SIG_ERR) {
printf("PID %d can't catch SIGUSR1\n", getpid());
exit(1);
}
printf("PID1 %d sigusr1 handler2 installation\n", getpid());
pause();
}
if (pid2 == 0) {
signal(SIGUSR2, sigusr2Handler1);
printf("PID2 %d sigusr2 handler installation\n", getpid());
kill(0, SIGUSR2);
}
}
return 0;
}
void sigusr2Handler1(int sig)
{
printf("PID %d Received SIGUSR2. 1/%d = %f.\n", getpid(), arg, (float)1 / arg);
sleep(arg);
if (kill(pid1, SIGUSR1) < 0) {
perror("Kill error");
exit(1);
}
printf("PID %d. Sent SIGUSR1 to %d. Closing\n", getpid(), pid1);
exit(0);
}
void sigusr1Handler2(int sig)
{
printf("PID %d Received SIGUSR1. Closing.\n", getpid());
exit(0);
}