我编写了一些代码来练习管道的使用,并遇到了一些问题。
对于下面的代码,我尝试创建一个命名管道来写/读。但是,如果我的文本文件中有一些单词,我的代码就不能工作。我预期输出将打印出文本文件中的单词和我所写的字符串。我不能用.txt文件作为管道吗?如何使用管道修改文本文件?谢谢你的帮助!
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#define MAX 100
int main()
{
int fd;
char *myfifo = "pipe_tx2.txt";
char buf[MAX];
/* create the fifo */
mkfifo(myfifo, 666);
/* write string to the pipe */
fd = open(myfifo, O_WRONLY);
write(fd, "hello", sizeof("hello"));
close(fd);
/* read and display message from pipe */
fd = open(myfifo, O_RDONLY);
read(fd, buf, MAX);
printf("we got: %s\n", buf);
close(fd);
/* remove the pipe */
unlink(myfifo);
return 0;
}发布于 2015-12-03 18:32:46
您的代码中存在一些问题。首先,每个人都注意到,您的访问权限是错误的,请在八进制0666中指定它们。
但是,最糟糕的是,在命名管道上打开/读/写的语义与普通文件不同。用于编写命名管道的open会被阻塞,直到有人打开它进行阅读,然后再打开它。因此,单个进程不能以这种方式使用命名管道(请记住,管道通常用于进程之间的通信)。您需要的是先在非阻塞模式下打开阅读,然后立即将模式设置为以后的阻塞,然后打开以便写入,这样书写部分就可用了。
另一个问题是,您没有发送正确的数据。您应该使用strlen来捕获C-字符串的长度,并添加一个来计数,并包含NUL终止字符,因此在另一部分读取完整的C-字符串是正确的。
https://stackoverflow.com/questions/34068932
复制相似问题