gpt4 book ai didi

c++ - 为什么我的程序在打开 mkfifo 管道时会挂起?

转载 作者:IT老高 更新时间:2023-10-28 23:11:19 25 4
gpt4 key购买 nike

我使用 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+" (参见 this question for the differences 的答案)。

此程序将正确写入 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 将阻塞,直到打开FIFO 进行读取。当它阻塞时,在另一个终端中运行它:

$ cat /tmp/myFIFO
Hello, world!
$

之所以阻塞是因为fopen没有把O_NONBLOCK传给open:

$ strace -P /tmp/myFIFO ./a.out
open("/tmp/myFIFO", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
...

关于如何打开 FIFO 的一些背景知识

只读,没有 O_NONBLOCK:open 阻塞,直到另一个进程打开 FIFO 进行写入。这是将 fopen 与模式参数 "r" 一起使用时的行为。

只写,没有 O_NONBLOCK:open 阻塞,直到另一个进程打开 FIFO 进行读取。这是将 fopen 与模式参数 "w" 一起使用时的行为。

只读,带有 O_NONBLOCK:open 立即返回。

只写,使用 O_NONBLOCK:open 返回错误,errno 设置为 ENXIO,除非另一个进程已打开 FIFO 以供读取。

<支持>来自 W. Richard Stevens 的“UNIX 环境中的高级编程”的信息。

打开一个 FIFO 用于读取写入

在 Linux 中也可以在同一进程中打开 FIFO 进行读取和写入。 Linux FIFO man page状态:

Under Linux, opening a FIFO for read and write will succeed both in blocking and nonblocking mode. POSIX leaves this behavior undefined. This can be used to open a FIFO for writing while there are no readers available. A process that uses both ends of the connection in order to communicate with itself should be very careful to avoid deadlocks.

这是一个写入和读取同一个 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;
}

不阻塞,立即返回:

$ gcc fifo.c && ./a.out 
Hello, world!

请注意,这是不可移植的,可能无法在 Linux 以外的操作系统上运行。

关于c++ - 为什么我的程序在打开 mkfifo 管道时会挂起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8507810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com