是否可以不使用管道从子节点写入文件流并从父节点读取它?
我有:
FILE *fp;
char *msg = "TEST MESSAGE";
if (fork() == 0) {
fp = fopen("temp.txt", "w");
dup2(fileno(fp), STDOUT_FILENO);
execlp("echo", "echo", msg, NULL);
}
fp = fopen("temp.txt", "r");
char buf[1000];
fgets(buf, sizeof(buf), fp);
printf("received: %s\n", buf);
fclose(fp);
当我试图在父进程中读取temp.txt时,它是空的,但如果我在运行程序后将其删除,它会显示测试消息。我尝试刷新并查找(0)fp,但不起作用。
1条答案
按热度按时间wwodge7n1#
这在原则上是可行的,但是你有一个race condition:有可能父进程在子进程开始写文件之前就读取了它。请记住,它们是并行执行的。
但是,例如,如果在尝试读取文件之前,您有子文件的父文件
waitpid
,您应该会发现它具有正确的内容。还有许多其他可能的方法来同步这两个进程,以便父进程只在知道子进程已经完成写入之后才读取:文件锁、信号灯、信号等等。