在命名管道中使用 open 函数

Using the open function in 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;
}

当我先 运行 "Write after read" 然后 "Read after write" 时,它似乎有效。
但是当我反之亦然(即 运行 "Read after Write")时,他们打印 "Before opening" 并继续 运行.

请解释我做错了什么。

问题是您的 READ AFTER WRITE 程序从尚未创建的命名管道 myfifo 中读取。当您尝试首先执行 READ AFTER WRITE 程序时。我在您的程序中添加了以下两个条件(请参阅下面的代码)以检查您的名称管道是否存在问题,并且当您第一次执行 READ AFTER WRITE 程序时确实弹出了您的 myfifo 管道未创建的问题。

现在发生的事情是,由于未创建管道,因此您的 READ AFTER WRITE 一直在等待其他进程写入,以便可以读取某些内容。另外,另一方面,您的第二个程序也一直站在 "opening..." 上,因为另一方面没有 reader 来读取它应该写的内容。

现在,当您首先执行第二个程序时,这个问题就解决了,因为已经为 READ AFTER WRITE 创建了 myfifo 管道 read.This 程序是真正合乎逻辑的,因为您正在尝试从命名管道 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;
}