Двусторонняя связь между детьми и родителями по сигналам - PullRequest
0 голосов
/ 11 октября 2019

Я новичок в 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
...

1 Ответ

0 голосов
/ 11 октября 2019

Я думаю, что здесь происходит то, что ребенок получает сигнал, пока он ждет. Помещение «сигнала (SIGUSR1, ChildHandler)» над призывом к сну должно исправить это.

...