【发布时间】:2019-05-04 16:19:50
【问题描述】:
我不想编写一个使用 2 个管道在父进程和子进程之间传递值的程序。代码:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/stat.h>
#include <fcntl.h>
int mkfifo(const char *path, mode_t mode);
int main(int argc, char **argv)
{
int fd,df,val;
char * myfifo = "/tmp/myfifo";
mkfifo(myfifo, 0666);
char * myfifo2 = "/tmp/myfifo2";
mkfifo(myfifo2, 0666);
pid_t c=fork();
if(c==0){
df = open(myfifo2, O_RDONLY);
read(df, &val, sizeof(val));
close(df);
val= val+10;
df = open(myfifo2, O_WRONLY);
write(df, &val, sizeof(val));
fd = open(myfifo, O_WRONLY); //if i put this write first print works and program finishes
write(fd, &val, sizeof(val));
}
if(c>0)
{
val=1;
df = open(myfifo2, O_WRONLY);
write(df, &val, sizeof(val));
fd = open(myfifo, O_RDONLY);
read(fd, &val, sizeof(val));
printf("val is %d \n",val);
}
}
子进程的第一次读取等待父进程在fifo文件中写入val。之后它将一个新的val写入这个fifo文件,然后将一个值写入第二个文本文件。读取父进程的代码等待这个写要发生。所以,总而言之,我想要的是父进程仅在子进程在 myfifo2 文件中写入 val 后才执行打印。这就是我使用的第二个命名管道的目的。但是,这段代码得到了卡住并且什么也不打印。我注意到,如果我改变两个在子进程中写入的轮次,它可以工作,但它不能满足我需要的上述内容。为什么会发生这种情况,我该如何解决这个问题?
【问题讨论】:
-
你为什么要使用命名管道呢?使用
pipe创建管道。
标签: c operating-system