我有两个过程
首先阅读然后写。
其他人先写,然后阅读
我想用两个管道来实现它。
以下是我的实施
/***READ BEFORE WRITE*****/
#include <fcntl.h>
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>
#define MAX_BUF 1024
int main()
{
int fd,fd1;
char buf[MAX_BUF];
char * myfifo = "/home/aditya/Desktop/myfifo";
char * mynewfifo = "/home/aditya/Desktop/mynewfifo";
mkfifo(mynewfifo, 0666);
printf("Read before writing\n");
printf("Before opening\n");
fd = open(myfifo, O_RDONLY);
fd1 = open(mynewfifo, O_WRONLY);
printf("After opening\n");
read(fd, buf, MAX_BUF);
printf("Received: %s\n", buf);
close(fd);
printf("reader is writing\n");
write(fd1, "Hi", sizeof("Hi"));
close(fd1);
unlink(mynewfifo);
return 0;
}
/**** Wriiting after Reading ******/
#include <fcntl.h>
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
int fd,fd1;
char * myfifo = "/home/aditya/Desktop/myfifo";
char * mynewfifo = "/home/aditya/Desktop/mynewfifo";
char buf[1024];
mkfifo(myfifo, 0666);
printf("writing before reading\n");
printf("Before opening\n");
fd = open(myfifo, O_WRONLY);
fd1=open(mynewfifo,O_RDONLY);
printf("After opening\n");
write(fd, "Hi", sizeof("Hi"));
close(fd);
printf("Writer is reading\n");
read(fd1, buf, 1024);
printf("Received: %s\n", buf);
close(fd1);
/* remove the FIFO */
unlink(myfifo);
return 0;
}
当我首先运行“写后读”然后“写后读”时,它似乎有效 但当我反之亦然时(即“写后读”),他们打印“打开前”并继续运行。
请解释我做错了什么。
答案 0 :(得分:1)
问题是你的READ AFTER WRITE程序从一个尚未创建的命名管道myfifo中读取。当您尝试在第一个位置执行READ AFTER WRITE程序时。我在您的程序中添加了以下两个条件(请参阅下面的代码),以检查您的名称管道中是否存在问题,并且在您第一次执行READ AFTER WRITE程序时,确实弹出了未创建myfifo管道的问题。 / p>
现在发生的事情是因为没有创建管道,所以你的READ AFTER WRITE一直在等待其他一些进程写入,这样才能读取。另外,另一方面,你的第二个程序也一直站在“开放......”上,因为另一方面没有读者可以阅读它应该写的内容。
现在当你第一次执行你的第二个程序时,这个问题就解决了,因为myfifo管道已经为READ AFTER WRITE程序创建了。这是真正合乎逻辑的,因为你试图从一个命名管道myfifo中读取你的第二个项目。
因此,请始终检查您的程序是否创建了您正在使用的管道。
/***READ AFTER WRITE*****/
#include <fcntl.h>
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>
#define MAX_BUF 1024
int main()
{
int fd,fd1;
char buf[MAX_BUF];
char * myfifo = "/home/aisha/Desktop/myfifo";
char * mynewfifo = "/home/aisha/Desktop/mynewfifo";
mkfifo(mynewfifo, 0666);
printf("Read before writing\n");
printf("Before opening\n");
fd = open(myfifo, O_RDONLY);
if(fd<0)
{
printf("MYFIFO NOT MADE\n");
}
fd1 = open(mynewfifo, O_WRONLY);
if(fd1<0)
{
printf("MYNEWFIFO NOT MADE\n");
}
sleep (2);
printf("After opening\n");
read(fd, buf, MAX_BUF);
printf("Received: %s\n", buf);
close(fd);
printf("reader is writing\n");
write(fd1, "Hi", sizeof("Hi"));
close(fd1);
unlink(mynewfifo);
return 0;
}