0

ユーザーからの入力がライター関数によって標準出力に書き込まれる単純な読み取り/書き込みプログラムに 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;
}                      
4

1 に答える 1

0

ファイルにロックをかける必要があります。そうしないと、他の誰かが書き込んでいるときに読み込もうとする可能性があります。また、書き込みバッファをフラッシュしたい場合、カーネルの書き込みバッファがいっぱいになってからファイルに書き込むまで、FIFO への変更が実際には記録されない可能性があります (Linux では、書き込みはその正確な瞬間に書き込みが行われることを保証しません)。 . stdout をフラッシュしているのがわかりますが、ファイル記述子の fsync も行う必要があります. これにより、書き込み操作中にファイルがロックされ、他の誰も書き込みできなくなります. 読み取り用にファイルをロックするには、セマフォを使用します。

于 2013-05-13T13:08:27.367 に答える