具有命名管道的应用程序中的输出为空
Empty output in app with named pipes
我有一个关于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
你真的需要写两次PID,这样其他两个进程中的每一个都可以读取它
您需要修复对文件描述符的测试。你的代码看起来像:
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))
然后你就会遇到时间问题。
read()
调用是非阻塞的(因为您使用O_NONBLOCK打开了FIFO(,所以当没有数据可供读取时,它们会返回-1,errno
设置为EAGAIN
。也许你应该在文件打开后将模式更改为阻塞(一对fcntl()
调用,IIRC(,或者你需要循环直到你读到一些输入,最好在循环中有一个亚秒的延迟,或者你可以使用poll()
或select()
来等待输入(但要小心:O_NONBLOCK可能会把它们搞砸(。
- 如何从Windows应用程序输出到标准?
- 如何从 Win32 C++ 应用程序输出到父控制台窗口?
- 如何在 html 页面中插入 cgi 应用程序的输出?
- Qt creator 4.11,在应用程序输出面板中创建一个链接
- 将控制台应用程序直接输出到Visual Studio而不是外部Windows控制台中
- 为什么Qt Creator的应用程序输出不能从spdlog记录器打印
- 如何使用 ALSA API 在应用程序中在单声道和立体声之间切换声音输出?
- 如何读取windows服务启动的控制台应用程序的输出
- Windows 中应用程序的每秒输入/输出操作数
- C#类过程 - 控制C 应用程序,不可能读取输出
- QT小部件应用程序输出到控制台
- 如何在不将其连接到终端的情况下运行'screen',以便我可以在C++ (qt) 应用程序中捕获输出?
- 如何显示基于 MFC 的应用程序类文件的输出
- 如何在IDE中而不是在命令提示符中显示Visual Studio控制台应用程序输出
- 如何将OpenCV的输出显示或流式传输到HTML页面或其他一些客户端应用程序
- 基本C++应用程序具有额外的输出,然后应该
- 应用程序在显示最终输出之前结束
- 具有控制台输出且没有新窗口的 Win32 应用程序
- 在Qt应用程序中读取python脚本C++输出
- Win32应用程序使用printf将输出写入控制台