gpt4 book ai didi

c - 没有子进程的命名管道

转载 作者:行者123 更新时间:2023-11-30 17:51:46 25 4
gpt4 key购买 nike

我使用 FIFO 来实现简单的读/写程序,其中用户的输入由写入器函数写入标准输出。然而问题是,我是否能够在不创建子进程(使用 fork() 操作)的情况下运行该程序。从我从有关 FIFO 的示例中看到的情况来看,大多数具有命名管道/FIFO 的读/写程序都是通过 2 个文件完成的 - 一个用于读取,一个用于写入。我可以在一个文件中完成这些操作吗?

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>

/* read from user */
void reader(char *namedpipe) {
char c;
int fd;
while (1) {
/* Read from keyboard */
c = getchar();
fd = open(namedpipe, O_WRONLY);
write(fd, &c, 1);
fflush(stdout);
}
}

/* writes to screen */
void writer(char *namedpipe) {
char c;
int fd;
while (1) {
fd = open(namedpipe, O_RDONLY);
read(fd, &c, 1);
putchar(c);
}
}

int main(int argc, char *argv[]) {
int child,res;

if (access("my_fifo", F_OK) == -1) {
res = mkfifo("my_fifo", 0777);
if (res < 0) {
return errno;
}
}

child = fork();
if (child == -1)
return errno;
if (child == 0) {
reader("my_fifo");
}
else {
writer("my_fifo");
}


return 0;
}

最佳答案

您需要对该文件加锁,否则您可能会在其他人写入时尝试读取该文件。您还需要刷新写入缓冲区,否则对 fifo 的更改实际上可能不会被记录,直到内核写入缓冲区填满然后写入文件(在 Linux 中,写入并不能保证在该时刻发生写入) .我看到您正在刷新标准输出,但您还应该在文件描述符上进行fsync。这将导致文件在任何写入操作期间锁定,以便其他人无法写入。为了锁定文件以进行读取,您可能有使用信号量。

关于c - 没有子进程的命名管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16522405/

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