C++ 为什么我的程序在打开mkfifo ed管道时挂起?
我使用mkfifo创建命名管道。 然后我用下面的程序打开它。但是,程序挂起在“fopen”行。这里有什么问题吗C++ 为什么我的程序在打开mkfifo ed管道时挂起?,c++,c,mkfifo,C++,C,Mkfifo,我使用mkfifo创建命名管道。 然后我用下面的程序打开它。但是,程序挂起在“fopen”行。这里有什么问题吗 int main(int argc, char** argv) { char* line = "hello, world!"; FILE* fp = fopen("/tmp/myFIFO", "rw"); fprintf(fp, line); fclose(fp); return 0; } 进程阻塞,直到管道的另一端打开。进程阻塞,直到管道的另一端打开。尝试将“w”作为模式传递到fo
int main(int argc, char** argv) {
char* line = "hello, world!";
FILE* fp = fopen("/tmp/myFIFO", "rw");
fprintf(fp, line);
fclose(fp);
return 0;
}
进程阻塞,直到管道的另一端打开。进程阻塞,直到管道的另一端打开。尝试将
“w”
作为模式传递到fopen<代码>“rw”不是fopen
的有效模式参数,即使是,您也可能不希望在同一过程中读取和写入FIFO(尽管有可能,请参见下文)
另外,打开文件进行读写的正确模式参数是“r+”
或“w+”
(请参阅的答案)。
该程序将正确写入FIFO:
#include <stdio.h>
int main(int argc, char** argv) {
FILE* fp = fopen("/tmp/myFIFO", "w");
fprintf(fp, "Hello, world!\n");
fclose(fp);
return 0;
}
它阻塞的原因是fopen
没有将O\u NONBLOCK
传递到open
:
$ strace -P /tmp/myFIFO ./a.out
open("/tmp/myFIFO", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
...
关于如何打开FIFO的一些背景信息
只读,不带非块:打开
块,直到另一个进程打开FIFO进行写入。这是将fopen
与模式参数“r”
一起使用时的行为
只写,不带非块:打开
块,直到另一个进程打开FIFO进行读取。这是将fopen
与模式参数“w”
一起使用时的行为
只读,带O_NONBLOCK
:open
立即返回
仅写,带O_NONBLOCK
:open
返回一个错误,将errno
设置为ENXIO
,除非另一个进程打开了FIFO进行读取
信息来自W.Richard Stevens的“UNIX环境中的高级编程”。
打开FIFO进行读写操作
在Linux中,在同一进程中打开FIFO进行读写也是可能的。各国:
在Linux下,打开FIFO进行读写操作将在以下两个方面都取得成功:
阻塞和非阻塞模式。POSIX未定义此行为。
这可用于在没有读卡器的情况下打开FIFO进行写入
可用。按顺序使用连接两端的进程
与自身沟通时应非常小心,以避免死锁
这是一个向同一FIFO写入和读取数据的程序:
#include <stdio.h>
int main(int argc, const char *argv[]) {
char buf[100] = {0};
FILE* fp = fopen("/tmp/myFIFO", "r+");
fprintf(fp, "Hello, world!\n");
fgets(buf, sizeof(buf), fp);
printf("%s", buf);
fclose(fp);
return 0;
}
请注意,这是不可移植的,可能在Linux以外的操作系统上不起作用。尝试将“w”
作为模式传递给fopen<代码>“rw”不是fopen
的有效模式参数,即使是,您也可能不希望在同一过程中读取和写入FIFO(尽管有可能,请参见下文)
另外,打开文件进行读写的正确模式参数是“r+”
或“w+”
(请参阅的答案)。
该程序将正确写入FIFO:
#include <stdio.h>
int main(int argc, char** argv) {
FILE* fp = fopen("/tmp/myFIFO", "w");
fprintf(fp, "Hello, world!\n");
fclose(fp);
return 0;
}
它阻塞的原因是fopen
没有将O\u NONBLOCK
传递到open
:
$ strace -P /tmp/myFIFO ./a.out
open("/tmp/myFIFO", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
...
关于如何打开FIFO的一些背景信息
只读,不带非块:打开
块,直到另一个进程打开FIFO进行写入。这是将fopen
与模式参数“r”
一起使用时的行为
只写,不带非块:打开
块,直到另一个进程打开FIFO进行读取。这是将fopen
与模式参数“w”
一起使用时的行为
只读,带O_NONBLOCK
:open
立即返回
仅写,带O_NONBLOCK
:open
返回一个错误,将errno
设置为ENXIO
,除非另一个进程打开了FIFO进行读取
信息来自W.Richard Stevens的“UNIX环境中的高级编程”。
打开FIFO进行读写操作
在Linux中,在同一进程中打开FIFO进行读写也是可能的。各国:
在Linux下,打开FIFO进行读写操作将在以下两个方面都取得成功:
阻塞和非阻塞模式。POSIX未定义此行为。
这可用于在没有读卡器的情况下打开FIFO进行写入
可用。按顺序使用连接两端的进程
与自身沟通时应非常小心,以避免死锁
这是一个向同一FIFO写入和读取数据的程序:
#include <stdio.h>
int main(int argc, const char *argv[]) {
char buf[100] = {0};
FILE* fp = fopen("/tmp/myFIFO", "r+");
fprintf(fp, "Hello, world!\n");
fgets(buf, sizeof(buf), fp);
printf("%s", buf);
fclose(fp);
return 0;
}
请注意,这是不可移植的,可能无法在Linux以外的操作系统上工作