首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fifo ()和read()不工作于stdio,而不是fifo

fifo ()和read()不工作于stdio,而不是fifo
EN

Stack Overflow用户
提问于 2015-12-25 21:02:22
回答 2查看 160关注 0票数 2

我有一个与fifos、write()read()函数相关的问题。我确实是通过mkfifo()函数创建fifo的,然后使用fork()生成两个进程:第一个进程打开并通过read()写入fifo;另一个进程打开并通过read()读取。我的问题是,write()在stdout上写东西,read()等待我在stdin上写东西,然后按Enter,就像一个scanf(),因此不使用fifo。我真的不知道该怎么做了,我已经尝试过任何事情,到目前为止还没有在互联网上发现任何相关的问题。我正在使用gcc编译器和Xubuntu 15.10。

过程生成器

代码语言:javascript
复制
int main (void) {

    int f = mkfifo("try", S_IRUSR | S_IWUSR);
    if (f < 0)
        printf("mkfifo went fine\n");
    else
        printf("mkfifo went wrong\n");
    pid_t fo = fork();
    switch (fo) {
    case -1:
        printf("err\n");
    case 0:
        execlp("prova_fifo2", "prova_fifo2", NULL);
    default:
        execlp("prova_fifo", "prova_fifo", NULL);
    }

    return (0);
}

Writer (又名prova_fifo)

代码语言:javascript
复制
int main (void) {

    int fd;
    if (fd = open("try", O_WRONLY) == -1)
        printf("Error opening FIFO\n");

    char buf[6];
    sprintf(buf, "hello");
    int writer = write(fd, buf, strlen(buf));
    printf("%d", writer);
    return (0);
}

阅读器(又名prova_fifo2)

代码语言:javascript
复制
int main (void) {

    int fd;
    if (fd = open("try", O_RDONLY) ==-1)
    printf("Errore in apertura FIFO\n");

    char buf[6];
    read(fd,&buf, strlen(buf)); //tried removing the "&", didn't work
    printf("READ: %s", buf);
    return (0); 
}

注意:我正在包括所有必要的库,代码编译和运行。我唯一的问题就是上面提到的问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-25 21:10:45

这是一个http://en.cppreference.com/w/c/language/operator_precedence问题,表达式fd=open("try", O_WRONLY )==-1等价于fd=(open("try", O_WRONLY )==-1),这绝对不是您想要的,因为如果可以找到文件,则将open(...)==-1的结果分配给fd,这将是假的(即,0是标准输入的文件描述符),而1则是无法找到的。

你需要做(fd=open("try", O_WRONLY ))==-1

票数 1
EN

Stack Overflow用户

发布于 2015-12-25 21:11:42

您不能明智地在未初始化的strlen()数组上调用char。你应该这样做:

代码语言:javascript
复制
read(fd, buf, sizeof(buf));

而不是。

请注意,read()不会零终止您的数组,printf()希望为%s接收这样的东西,因此您可能希望将整个过程更改为:

代码语言:javascript
复制
char buf[7] = {0};
if ( read(fd, buf, sizeof(buf) - 1) > 0 ) {
    printf("READ: %s\n", buf);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34466383

复制
相关文章

相似问题

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