0

Fifo と C でのプログラム開発に対する個人的な関心から、私はこの演習に行き詰まっています。明らかに大きな間違いを犯しています。Fifo が作成されましたが、内部にフローがありません。Fifo の保護/クローズ/オープン メカニズムに依存する必要があります。助けてください。

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

int main(int argc, char** argv)
{
  int c;
  int fi;
  int fo;
  int stat;
  int pid;
  fprintf(stderr, "Fifo...\n");

  if (mkfifo("FifoA", 0666)==-1) {
    exit(1);
  }

  if (mkfifo("FifoB", 0666)==-1) {
    exit(1);
  }

pid = fork();

  switch (pid) {
  case 0:

  if((fo=open("FifoA",O_RDONLY))==-1)
    {
       perror("error FifoA");
       exit(1);
    }

    close(fi); 
    while (read(fo, &c, 1)>0) {

      c = toupper(c);
      fputc(c,stdout);   
}
    break;
  case -1: 
    fprintf(stderr, "Fork error\n");
    exit(1);
  default:

  if((fi=open("FifoB",O_WRONLY))==-1)
    {
       perror("error FifoB");
       exit(1);
    }
    close(fo); 
    while ((c = fgetc(stdin))!=EOF) {
      write(fi, &c, 1);
    }
    close(fi);
    wait(&stat);
    break;
  }

  return 0; 
}
4

1 に答える 1

1

fork()あなたの後O_RDONLY、子、およびO_WRONLY親でfifo を開きます。これにより、fifo は両端が開いていることを認識し、通信を開始します。fifo は単方向でO_RDWRあり、意味がないことに注意してください。

最後の問題は、2 つの異なる fifo を作成し、それらが互いに通信することを期待していることです。

if((fo=open("FifoA",O_RDONLY))==-1)
//...
if((fi=open("FifoB",O_WRONLY))==-1)

する必要があります

if((fo=open("FifoA",O_RDONLY))==-1)
//...
if((fi=open("FifoA",O_WRONLY))==-1) 

fifo には 2 つの側面があります。一方のプロセスは一方から書き込み、もう一方は他方から読み取ります。唯一の目標が書き込みと読み取りのプログラムである場合、必要な fifo は 1 つだけです。

于 2012-05-03T11:44:55.437 に答える