0

我将 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;
}                      
4

1 回答 1

0

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

于 2013-05-13T13:08:27.367 回答