gpt4 book ai didi

c - mkfifo 使 2 个进程相互通信

转载 作者:行者123 更新时间:2023-11-30 14:55:20 24 4
gpt4 key购买 nike

我正在尝试编写两个使用 fifo 管道相互通信的程序。我使用了例子here (第 5.2 节),但我将那里的 mknod 更改为 mkfifo 并尝试将 gets 更改为 fgets。这是代码(写入 fifo 的一个程序):

#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,迂腐的)。

谢谢

最佳答案

mkfifo() 只是在文件系统中创建特殊节点。您可以自由地以任何方式打开它。实际上有两种选择 - POSIX“非缓冲”I/O:open()/write()/read() 或标准缓冲 I/O:fopen()/fread( )/fwrite()。第一个系列对文件描述符进行操作,而第二个系列使用所谓的文件流:FILE。您不能随意混合这些 API。只需选择一项并坚持下去。与低级非缓冲 I/O 相比,标准 I/O 库提供了一些有用的额外功能。就像您尝试使用的 fgets() 一样。在这种情况下,使用标准流并将 open() 替换为:

是合理的
FILE* stream = fopen(FIFO_PATH, "r+");

因此程序将使用FILE*而不是普通文件描述符。另外,需要将 write() 更改为 fwrite(),后跟 fflush(),以保证写入的数据传递到 FIFO。

附注在必要的情况下,可以用标准的 FILE*“包装”由 open()(或其他)返回的低级描述符。请参阅fdopen() 。但这很像一种解决方法,将标准 I/O API 与无法使用 fopen() 打开的特殊文件对象结合使用。

关于c - mkfifo 使 2 个进程相互通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45962906/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com