Сигналы и процессы

Процесс 1 открывает два файла и порождает потомков 2 и 3. Процессы 2 и 3 с интервалом в 1 секунду (через alarm) посылают по N сигналов процессу 1, который по каждому сигналу пишет в соответствующий файл по M чисел. Потом процессы 2 и 3 считывают данные из файлов, выводят их на экран и завершаются. Процесс 1 завершается последним. Я пытался сделать задачу, но когда я отправлял сигнал из процесса 1 в процесс 2 , что нужно считать данные , он выдавал ошибку. User defined signal 1.

#include <signal.h>
#include <stdio.h>
#include <unistd.h>

#define LEN 100

char buf[BUFSIZ];

void prn(int sn)
{
    printf("Signal handler says: %s\n", buf);
}

char fail[LEN];

void child(int signo)
{
    FILE *F1;
    F1 = fopen("s1.txt", "r");
    while (fgets(fail, LEN, F1))
        ;
    fprintf(stdout, "%s\n", fail);
}

int main(void)
{
    int pid = fork();
    if (pid > 0) // код предка
    {
        FILE *F1;
        F1 = fopen("s1.txt", "w");
        if (F1 != NULL)
        {
            kill(0, SIGCONT);
            signal(SIGUSR1, prn);
            (printf("> ") && fgets(buf, BUFSIZ, stdin) && *buf != '\n');
            raise(SIGUSR1);
            fputs(buf, F1); // вывожу в файл содержимое файла 

            kill(0, SIGUSR2);
        }
    } 
    else
    {
        raise(SIGSTOP); // код потомка 1
        kill(getppid(), SIGUSR1); // передаю сигналы предку 
        signal(SIGUSR2, child);
    }
    return 0;
}

Ответы (1 шт):

Автор решения: user7860670

Родительский процесс может установить обработчик сигнала после того, как тот будет отправлен. Далее, родительский процесс отправляет сигнал сам себе. Далее, в обработчиках сигналов можно выполнять только небольшой список async signal safe функций, выставляйте в нем атомарный флажок, никаких fprintf. Далее, родительский процесс не ждет завершения дочерних процессов и не подчищает за ними (wait).

→ Ссылка