Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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 无法打开FIFO进行写入_C_Unix_File Io_Fifo_Mkfifo - Fatal编程技术网

C 无法打开FIFO进行写入

C 无法打开FIFO进行写入,c,unix,file-io,fifo,mkfifo,C,Unix,File Io,Fifo,Mkfifo,“服务器”程序端: #define RESP_FIFO_NAME "response" /* Global Variables */ char *cmdfifo = CMD_FIFO_NAME; /* Name of command FIFO. */ char *respfifo = RESP_FIFO_NAME; /* Name of response FIFO. */ int main(int argc, char* argv[]) { int infd, outfd; /* FIFO

“服务器”程序端:

#define RESP_FIFO_NAME "response"

/* Global Variables */
char *cmdfifo = CMD_FIFO_NAME; /* Name of command FIFO. */
char *respfifo = RESP_FIFO_NAME; /* Name of response FIFO. */

int main(int argc, char* argv[]) {
int infd, outfd; /* FIFO file descriptors. */

... // blah blah other code here

/* Create command FIFO. */
if (mkfifo(cmdfifo, FIFO_MODE) == -1) {
    if (errno != EEXIST) {
        fprintf(stderr, "Server: Couldn’t create %s FIFO.\n", CMD_FIFO_NAME);
        exit(1);
    }
}

/* Create response FIFO. */
if (mkfifo(respfifo, FIFO_MODE) == -1) {
    if (errno != EEXIST) {
        fprintf(stderr, "Server: Couldn’t create %s FIFO.\n", RESP_FIFO_NAME);
        exit(1);
    }
}
/* Open the command FIFO for non-blocking reading. */
if ((infd = open(cmdfifo, O_RDONLY | O_NONBLOCK)) == -1) {
    fprintf(stderr, "Server: Failed to open %s FIFO.\n", CMD_FIFO_NAME);
    exit(1);
}

        /* Open the response FIFO for non-blocking writes. */
if ((outfd = open(respfifo, O_WRONLY | O_NONBLOCK)) == -1) {
            fprintf(stderr, "Server: Failed to open %s FIFO.\n", RESP_FIFO_NAME);
            perror(RESP_FIFO_NAME);
            exit(1);
        }
该程序打印以下内容的输出:

Server: Couldn’t create response FIFO.
我对FIFO了解很少,因为我的教授没有教我。这就是我通过阅读他的例子和课堂讲稿所能做到的。我尝试不使用O_NONBLOCK标志,但这只会导致程序挂起,因此它是必需的。我不明白为什么读取FIFO正常,但写入FIFO无法打开。

从手册页:

进程可以在非阻塞模式下打开FIFO。在这种情况下,打开 因为即使没有人在写端打开,只读也会成功 然而使用ENXIO(没有此类设备或 地址),除非另一端已经打开


您应该在“客户端”中打开此文件。

您应该在错误消息中报告
mkfifo()
调用中使用的名称-so
respfifo
而不是
RESP\u FIFO\u name
。当前目录(程序运行时的目录)中存在哪些FIFO?是否确实要在FIFO名称中包含尖括号(或者错误消息来自不同版本的代码)?您可以在输出中包括
errno
strerror(errno)
;这将有助于诊断问题是什么(EEXIST vs EPERM vs…)。使用
perror
strerror
来了解确切的错误是什么。
RESP\u FIFO\u NAME
是一个预处理器
\define
'd宏常量。我现在要补充一点。我认为这无关紧要,因为它只是一个字符串文本,直接替换文本。是的,我现在就用perror,看看实际的问题是什么。
perror(RESP\u FIFO\u NAME)
输出
:没有这样的设备或地址
,显然
ENXIO
很有趣:ENODEV没有被列为Mac OS X上
mkfifo(2)
的可能错误。你做过
chdir()
操作吗?我发现去掉尖括号不会改变结果。什么是先进先出模式?FIFO命令是否已经存在?好的。当时我被他的指示弄糊涂了,因为他说:
/*创建并适当地打开命令和回复FIFO*/在创建人造“客户端”(子)进程的进程分叉之前。我在客户端进程中打开了它,但这会在程序的后面发生…这很有趣-但会影响打开FIFO,而不是创建FIFO,这显然是问题所在@ICANTName:你确定是你的
mkfifo()
失败了吗?您有没有在不更改消息的情况下复制并粘贴错误消息块?失败的不是
mkfifo
,而是
O|u WRONLY | O_NONBLOCK
open
命令给了我一个
ENXIO:没有这样的设备或地址错误。我不知道为什么它会给我这个错误,因为我还不能访问客户机文件,所以我想这意味着我必须在程序中进一步向下移动,直到fork之后,否则就没有人读我写的东西了?我也这么想,这就是为什么你必须在客户机中打开这个fifo,我猜。@ICAntName:如果是
open()
(您没有显示)失败了,那么您的代码片段就完全让人困惑了——这就需要投反对票。Thomas发现的错误消息的描述完全适合于使用O_非块打开FIFO进行只写。也许您应该等待打开响应FIFO进行写入,直到您有一个客户机使用FIFO open for writing命令?或者也许你不想被封锁。。。