在命名管道中使用open函数

时间:2016-03-17 09:25:24

标签: ipc named-pipes

我有两个过程 首先阅读然后写。
其他人先写,然后阅读 我想用两个管道来实现它。

以下是我的实施

/***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;
}

当我首先运行“写后读”然后“写后读”时,它似乎有效 但当我反之亦然时(即“写后读”),他们打印“打开前”并继续运行。

请解释我做错了什么。

1 个答案:

答案 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;
}