【发布时间】:2020-01-06 07:47:56
【问题描述】:
我试图分叉一个进程并将父级的标准输出重定向到管道的写入端,将子级的标准输入重定向到管道的读取端。孩子应该读取整数,直到父母打印零。父级打印从 1 到 3,然后打印 0。父级和子级都打印开始和结束的时间。由于父母无法打印到标准输出,它会将其开始和结束时间发送给孩子,并且孩子会打印其开始时间和结束时间以及父母开始时间和结束时间。我本可以使用 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
【问题讨论】:
-
这里的dup有什么用?你想让父母只写,让孩子只读吗?在这种情况下,您可能需要考虑关闭孩子和父母各自的 fd...
-
是的,这就是我想要的。我考虑过这样做,但我在 dup2 的手册页中读到,如果之前打开了新文件描述符,它首先关闭它,然后分配它。