【发布时间】:2016-05-28 18:48:10
【问题描述】:
我想创建一个命名管道,然后写入它,然后我想读取它。这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
#define FIFO "fifo0001"
int main(intargc, char *argv[]){
char input[256];
FILE *fp;
char str[50];
printf("Please write some text:\n");
scanf("%s", input);
unlink(FIFO); /* Because it already exists, unlink it before */
umask(0);
if(mkfifo(FIFO, 0666) == -1){
printf("Something went wrong");
return EXIT_FAILURE;
}
if((fp = fopen(FIFO, "a")) == NULL){
printf("Something went wrong");
return EXIT_FAILURE;
}
fprintf(fp, "%s", input);
if(fgets(str, 50, fp) != NULL){
puts(str);
}
fclose(fp);
return EXIT_SUCCESS;
}
在我写完一篇文章后,什么都没有发生了。而且没有消息。我必须用 STRG C 退出程序。有人知道出了什么问题吗?我必须使用函数 mkfifo、fopen、fprintf、fgets 和 fclose。如果我可以将它们保留在代码中,那就太好了。
【问题讨论】:
-
FIFO 不能以这种方式工作。您需要两个程序,一个(仅)写入 FIFO,另一个(仅)读取。
-
是的,我知道那是我的目标,但我编写了一个程序来测试它。但是当我删除阅读部分时,会出现同样的问题
-
您的程序将阻塞,直到另一个程序打开 FIFO 的另一端进行读取。
-
@AndrewHenle 他打电话给
umask(0)。