Добавьте глобальную переменную со значением 0 в начале дочернего элемента. Поместите цикл времени в ребенка. Когда поступит сигнал, установите его в 1. В цикле while проверьте значение глобальной переменной, если она обращается в единицу, если это так, прочитайте и распечатайте и верните переменную обратно в 0.
Пример
#include <stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>
#include <sys/wait.h>
int signal_received = 0;
void handler(){
signal_received = 1;
}
int main(){
int fd[2],s;
pipe(fd);
pid_t c=fork();
if(c==0){
signal(SIGINT,handler);
while (1)
{
if (signal_received)
{
read(fd[0],&s,sizeof(s));
printf("%d",s);
signal_received = 0;
}
}
pause();
read(fd[0],&s,sizeof(s));
//if use printf("%d",s) here s=2 correctly.
}
if(c>0){
int i=2;
sleep(1);//i don't want the SIGINT signal to terminate the child process so i wait for it to reach pause
kill(c,SIGINT);
write(fd[1],&i,sizeof(i));
}
}
Конечно, это заглушка на то, что вы хотите, есть еще.
Вы можете добавить параллельную защиту для глобальной переменной.
Если у вас более сложная система, то лучше подойдет очередь сообщений.
Надеюсь, это поможет:)