Сигналы и процессы
Процесс 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 шт):
Родительский процесс может установить обработчик сигнала после того, как тот будет отправлен. Далее, родительский процесс отправляет сигнал сам себе. Далее, в обработчиках сигналов можно выполнять только небольшой список async signal safe функций, выставляйте в нем атомарный флажок, никаких fprintf. Далее, родительский процесс не ждет завершения дочерних процессов и не подчищает за ними (wait).