Я пытался раскошелиться на процесс и перенаправить стандартный вывод родительского элемента в конец записи канала, а стандартный вывод дочернего элемента - в конец чтения канала. Предполагается, что ребенок читает целые числа, пока родитель не напечатает ноль. родитель печатает от 1 до 3, а затем печатает 0. И родитель, и потомок печатают время, когда они начинают и когда они заканчивают sh. так как родитель не может печатать на стандартный вывод, он отправляет свое начальное и конечное время ребенку, а ребенок печатает как свое начальное и конечное время, так и родительское начальное и конечное время. Я мог бы использовать dup и перенаправить stdout в другой файловый дескриптор, но решил сделать это проще. Программа очень проста, но вывод, который я получаю, не создает сцену.
#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
int main()
{
int fd[2];
int p = pipe(fd);
int ch = fork();
if (ch)
{
// Parent - Counts from 1 to 3
int dp = dup2(fd[1], 1);
printf("Cnt_Started_at_%d\n", time(NULL));
for (int i = 0; i <= 3; i++)
{
printf("Parent %d\n", i);
sleep(1);
}
printf("0\n");
printf("Cnt_Finished_at_%d\n", time(NULL));
}
else
{
// Child - Terminated by 0
int dp = dup2(fd[0], 0);
printf("Trm_Started_at_%d\n", time(NULL));
char buffer[100];
scanf("%s", buffer);
printf("%s\n", buffer);
int i;
while (scanf("Parent %d", &i) && i)
printf("Recieved: %d\n", i);
scanf("%s", buffer);
printf("%s\n", buffer);
printf("Trm_Finished_at_%d\n", time(NULL));
}
}
Вывод:
Trm_Started_at_1578295974
Cnt_Started_at_1578295974
Parent
Trm_Finished_at_1578295978