【问题标题】:Using the open function in named pipes在命名管道中使用 open 函数
【发布时间】:2016-03-17 09:25:23
【问题描述】:

我有两个进程。
先读后写。
其他人会先写然后读。
我想用两个管道来实现它。

这是我的实现

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

当我先运行“读后写”然后“写后读”时,它似乎工作。
但是当我反之亦然(即运行“写入后读取”)时,它们会打印“打开前”并继续运行。

请解释我做错了什么。

【问题讨论】:

    标签: ipc named-pipes


    【解决方案1】:

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

    现在发生的情况是,由于未创建管道,因此您的 READ AFTER WRITE 一直在等待其他一些进程写入,以便可以读取某些内容。另外,另一方面,您的第二个程序也一直处于“正在打开...”,因为另一方面没有阅读器来阅读它应该写的内容。

    现在,当您首先执行第二个程序时,这个问题得到解决,因为已经创建了 myfifo 管道以供 READ AFTER WRITE 程序读取。这是真正合乎逻辑的,因为您试图从创建于你的第二个程序。

    因此,请务必在您的程序中检查您正在使用的管道是否已创建。

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

    【讨论】:

    • 如果您创建一个仅包含创建管道代码的单独文件,您的问题可以轻松解决。始终首先运行此文件,这样您就不会遇到任何“未创建管道”问题,然后由您决定是先运行 READ AFTER WRITE 还是另一个。希望这会有所帮助!
    猜你喜欢
    • 2014-07-28
    • 2011-04-02
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多