Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我的程序在打开mkfifo ed管道时挂起?_C++_C_Mkfifo - Fatal编程技术网

C++ 为什么我的程序在打开mkfifo ed管道时挂起?

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

我使用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”
作为模式传递到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以外的操作系统上工作