没有子进程的命名管道

时间:2013-05-13 12:45:26

标签: c named-pipes fifo

我使用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;
}                      

1 个答案:

答案 0 :(得分:0)

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