具有命名管道的应用程序中的输出为空

Empty output in app with named pipes

本文关键字:输出 应用程序 管道      更新时间:2023-10-16

我有一个关于linux上C++中命名管道的问题。我有三个应用程序。他们都是我管理的。每个应用程序都必须将其PID写入名为"第一"、"第二"或"第三"的通道。然后应用程序读取其他两个频道的内容并将其显示在屏幕上。

FIRST应用程序的输出示例:

"#1 pid-2000"//他的pid

"读取#2 pid-3000"//其他的pid

"读取#3 pid-5000"//其他的pid

FIRST应用程序的输出示例:"#2 pid-3000"读取#1 pid-2000"读取#3 pid-5000">

所有的应用程序都包含类似的代码,如下所示(第一个应用程序(:

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/stat.h>
int main(int argc, char* argv[])
{
char s1[15],s2[15],s3[15] ;
int fd1,fd2,fd3;
unlink("first") ;
if(mkfifo("first", S_IFIFO|0666)==-1)
{
    fprintf(stderr, "Error creating firstn");
    exit(0);
}
if(fd1=open("first",O_WRONLY)==-1)
{
    fprintf(stderr, "Error opening firstn");
    exit(0);
}
sprintf(s1,"#1 pid=%d", getpid());
write(fd1,&s1,sizeof(s1)) ;
printf("#1 pid=%d", getpid());
if(fd2=open("second",O_RDONLY|O_NONBLOCK)==-1)
{
    fprintf(stderr, "Error opening secondn");
    exit(0);
}
else
{ 
    if(read(fd2, &s2, 15)==-1)
        fprintf(stderr, "Error reading secondn");
    else
        fprintf(stdout,"nReaded - #2 pid - %s", s2);
}

if(fd3=open("third",O_RDONLY|O_NONBLOCK)==-1)
{
    fprintf(stderr, "Error opening thirdn");
    exit(0);
}
else
{ 
    if(read(fd3, &s3, 15)==-1)
        fprintf(stderr, "Error reading thirdn");
    else
        fprintf(stdout,"nReaded - #3 pid - %s", s3);
}
close(fd1) ; close(fd2); close(fd3);
return 1 ;
}

但是我没有输出!当我运行第一个应用程序时,我希望看到类似"#1-pid是1000"的内容,但什么都没有。当我运行第二个应用程序时,我希望看到"#2 pis是2000",并且在第一个应用程序中必须附加"#2 pid是2000"。所有应用程序的输出为空!哪里有错误?感谢

注释

您应该为所有三个进程都有一个单独的程序,它需要3个参数。为了便于讨论,第一个参数是进程应该创建的FIFO,另外两个参数是它应该读取的FIFO。然后您可以运行:

./your_prog first second third &
./your_prog second third first &
./your_prog third first second &

然而,如果你喜欢维护三个几乎相同的程序而不是一个程序,那么这是你的问题,而不是我的问题。

此外,当代码是纯C代码时,为什么这个问题被标记为"C++"?

Bugs

  1. 你真的需要写两次PID,这样其他两个进程中的每一个都可以读取它

  2. 您需要修复对文件描述符的测试。你的代码看起来像:

    if(fd2=open("second",O_RDONLY|O_NONBLOCK)==-1)
    

    应该是:

    if ((fd2 = open("second", O_RDONLY|O_NONBLOCK)) == -1)
    

    目前,您的文件描述符被分配了0或1,因为编译器将其视为您编写了:

    if (fd2 = (open("second", O_RDONLY|O_NONBLOCK) == -1))
    
  3. 然后你就会遇到时间问题。read()调用是非阻塞的(因为您使用O_NONBLOCK打开了FIFO(,所以当没有数据可供读取时,它们会返回-1,errno设置为EAGAIN。也许你应该在文件打开后将模式更改为阻塞(一对fcntl()调用,IIRC(,或者你需要循环直到你读到一些输入,最好在循环中有一个亚秒的延迟,或者你可以使用poll()select()来等待输入(但要小心:O_NONBLOCK可能会把它们搞砸(。