#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>
#include <fcntl.h>
#define FILENAME "file.txt"
#define BWR 512
int fd;
pid_t pd;
void sigHandler(int sig)
{
signal(SIGUSR1, sigHandler);
//signal(SIGUSR2, sigHandler);
switch(sig)
{
case SIGUSR1:
PrintFile();
break;
case SIGUSR2:
exit(0);
break;
}
}
//Функция чтения файла
void PrintFile(void)
{
static char buffer[BWR+1];
static int bytes;
pid_t pd1 = getpid();
printf("\nProcess with PID = %d printing file:\n", pd1);
bytes = read(fd, buffer, BWR);
buffer[bytes] = '\0';
printf("%s", buffer);
if(bytes < BWR) {
close(fd);
printf("\nFile closed by PID = %d\n", pd1);
printf("SIGUSR2 to PID %d\n", pd);
kill(pd, SIGUSR2);
exit(0);
}
else {
printf("\nSIGUSR1 to PID %d\n", pd);
kill(pd, SIGUSR1);
pause();
}
}
int main(void)
{
setpgrp();
signal(SIGUSR1, sigHandler);
signal(SIGUSR2, sigHandler);
fd = open(FILENAME, O_RDONLY);
if(fd == -1) {
fprintf(stderr, "Cannot open file %s\n", FILENAME);
return 1;
}
printf("Parent PID = %d\n", getpid());
pd = fork();
if(pd == 0) {
printf("Child PID = %d\n", getpid());
signal(SIGUSR1, sigHandler);
signal(SIGUSR2, sigHandler);
pd = getppid();
}
else
PrintFile();
return 1;
}
Синхроизация с помощью сигналов
Проблема в том, что дочерний процесс либо сразу виснет, когда ему sigusr1 пошлют, либо несколько раз примет и сделает как надо, а потом, когда ему родитель пошлет sigusr1, он опять виснет.
Вот код:
Код:
Проблема в том, что вы ждёте сигнал в самом обработчике сигнала. Лучше убрать оттуда pause(); и поставить while(1) pause(); перед выходом их main()
Цитата: disasm
Проблема в том, что вы ждёте сигнал в самом обработчике сигнала. Лучше убрать оттуда pause(); и поставить while(1) pause(); перед выходом их main()
Точно! Большое спасибо!