首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >文本文件可以用作管道吗?

文本文件可以用作管道吗?
EN

Stack Overflow用户
提问于 2015-12-03 14:46:46
回答 1查看 1.1K关注 0票数 0

我编写了一些代码来练习管道的使用,并遇到了一些问题。

对于下面的代码,我尝试创建一个命名管道来写/读。但是,如果我的文本文件中有一些单词,我的代码就不能工作。我预期输出将打印出文本文件中的单词和我所写的字符串。我不能用.txt文件作为管道吗?如何使用管道修改文本文件?谢谢你的帮助!

代码语言:javascript
运行
复制
#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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-03 18:32:46

您的代码中存在一些问题。首先,每个人都注意到,您的访问权限是错误的,请在八进制0666中指定它们。

但是,最糟糕的是,在命名管道上打开/读/写的语义与普通文件不同。用于编写命名管道的open会被阻塞,直到有人打开它进行阅读,然后再打开它。因此,单个进程不能以这种方式使用命名管道(请记住,管道通常用于进程之间的通信)。您需要的是先在非阻塞模式下打开阅读,然后立即将模式设置为以后的阻塞,然后打开以便写入,这样书写部分就可用了。

另一个问题是,您没有发送正确的数据。您应该使用strlen来捕获C-字符串的长度,并添加一个来计数,并包含NUL终止字符,因此在另一部分读取完整的C-字符串是正确的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34068932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档