首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >mkfifo使两个进程相互通信

mkfifo使两个进程相互通信
EN

Stack Overflow用户
提问于 2017-08-30 22:18:15
回答 2查看 573关注 0票数 0

我正在尝试写2个程序,将彼此交谈使用先进先出管道。我使用了示例here (5.2节),但我将那里的mknod改为mkfifo,并尝试将gets改为fgets。这是(一个写入fifo的程序的代码):

代码语言:javascript
运行
复制
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h> /*mkfifo, open */
#include <sys/wait.h>
#include <sys/stat.h> /* mkfifo, open */
#include <fcntl.h> /*open */

#define FIFO_PATH "/home/hana/Desktop"
#define BUFFER_SIZE 300



int main()
{
    char buffer[BUFFER_SIZE];
    int fd;
    int wStatus;

    mkfifo(FIFO_PATH, 666);
    printf("waiting for readers\n");
    fd = open(FIFO_PATH, O_RDWR);

    while (fgets(buffer, BUFFER_SIZE, fd), !feof(stdin)) 
    {
        if ((wStatus = write(fd, buffer, strlen(buffer))) == -1)
            perror("write");
        else
            printf("speak: wrote %d bytes\n", wStatus);
    }

    return 0;
}

我得到了一个编译错误:传递fgets的参数3使指针来自整数。所以fgets需要的是FILE*,而不是文件描述符。我该怎么办?改变一些东西,让fgets工作吗?使用另一个函数?

我正在和gcc (ansi,学究)一起编译。

谢谢

EN

Stack Overflow用户

发布于 2017-08-30 22:31:27

来自whjm的答案是导致错误诊断的原因,但我认为您的意思可能是

代码语言:javascript
运行
复制
fgets(buffer, BUFFER_SIZE, stdin)
//                         ^^^^^ 

从管道中读取数据,然后立即将相同的内容写回管道,这是不合理的。而且,如果你从来没有读过stdin,那么feof(stdin)永远不会是真的。

此外,对于fgets,只需检查null结果,然后在循环外部检查eof:

代码语言:javascript
运行
复制
while (fgets(...) != NULL)
{
    ...
}
if (!feof(stdin))
{
    // error handling
}
票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45962906

复制
相关文章

相似问题

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