我使用FIFO作为简单的读/写程序,其中来自用户的输入由writer函数写入标准输出。但问题是,我是否能够在不创建子进程的情况下运行此程序(使用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;
}
答案 0 :(得分:0)
您需要锁定文件,否则您可能会在其他人写作时尝试阅读。您还需要刷新写入缓冲区,或者在内核写入缓冲区填充然后写入文件之前,实际上不会记录对fifo的更改(在linux中,写入不保证在该确切时刻发生写入)我看到你正在刷新stdout,但是你也应该对文件描述符进行fsync。这会导致文件在任何写操作期间锁定,这样就没有其他人可以写了。为了锁定文件进行读取,你可能有使用信号量。