Ошибка Kill(): нет такого процесса?

Мне нужно вставить нечетное число терминалом. После этого он генерирует два процесса, 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);
}

person Franktrt    schedule 27.11.2014    source источник


Ответы (1)


pid1 был уничтожен к моменту, когда pid2 пытается отправить ему SIGUSR1. pid2 — убийца.

Когда pid2 выдает kill(0, SIGUSR2),, это отправляет SIGUSR2 всему процессу. группа, включая pid1. Это убивает pid1, который не готов к получению SIGUSR2.

person pilcrow    schedule 27.11.2014
comment
К сожалению, я думал, что это было правильно. Я исправляю его в kill(getpid(),SIGUSR2 и теперь он работает нормально. Но, если я делаю от отца процесс kill(pid2,SIGUSR2), он снова не работает. Как я могу отправить сигнал от отца к процесс Б? - person Franktrt; 27.11.2014