0

名前付きパイプを使用する 2 つの単純なプログラムがあります。最初のプログラムは次のとおりです。

int main(int argc,char **argv)
{
  if (argc<2)
   error_nsys_f("usage: [fifo]");

  if (mkfifo(argv[1],S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH)<0)
   error_sys_f("error while creating named pipe");

  int fd=open(argv[1],O_RDONLY);
  int log_file=open("wyniki.log",O_WRONLY | O_CREAT| O_TRUNC,S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH);
  long result;
  size_t len;
  if (fd<0)
   error_sys_f("error while openning pipe");
  if (log_file<0)
   error_sys_f("error while openning log file"); 
  //unlink(argv[1]);
  char path[MAXLINE];
  char buffer[BUF];
  while(1)
  {
   if (read(fd,&len,sizeof(size_t)) == -1)
   {
       cleanup(fd,argv[1]);
       error_sys_f("error while reading from file-name queue");
   }
   if (read(fd,path,len) == -1) 
   {
       cleanup(fd,argv[1]);
       error_sys_f("error while reading from file-name queue");
   }
   result=count(path,buffer);
   if (result>-1)
   {
       sprintf(buffer,"%s: %ld\n",path,result);
       if (write(log_file,buffer,strlen(buffer)) == -1)
       {
        cleanup(fd,argv[1]);
        error_sys_f("error while writing to log-file");
       }
   }
  }
}

そして2つ目

int main(int argc,char **argv)
{

 if (argc<3)
     error_nsys_f("usage: [fifo] [plik1] [plik2]...\n");

 int fd=open(argv[1],O_WRONLY);
 int i;
 int s;
 if (fd<1)
     error_sys_f("nie udalo sie otrzymac dostepu do kolejki");

 for(i=2;i<argc;++i)
 {
     s=strlen(argv[i])+1;
     if (write(fd,&s,sizeof(size_t)) == -1)
     {
      close(fd);
      error_sys_f("error while writing to queue");
     }
     if (write(fd,argv[i],strlen(argv[i])+1) == -1)
     {
      close(fd);
      error_sys_f("error while writing to queue");
     }
 }
 close(fd);
 return EXIT_SUCCESS;
}

2番目のプログラムでは、書き込み先のFIFOの名前とファイルの名前を彼に与え、最初のプログラムでは、名前とファイル名の長さを読み取り、バイト数を数えてログファイルに書き込みます。

しかし、問題があります。たとえば、1つのファイル名をfifoに書き込もうとすると、最初のプログラムが名前と長さを読み取り、カウントを実行しますが、その後、fifoから常に同じファイル名を読み取ります。彼は fifo から読み取ったメッセージを削除しなかったかのように振る舞います。これの原因は何ですか?

4

1 に答える 1

3

read() が 0 を返すケースを処理していません。これは、データがなくなり、もう一方の端がパイプを閉じたことを意味します。

したがって、read() が -1 を返すときだけでなく、0 を返す場合もループを停止する必要があります。

于 2012-05-12T12:32:55.200 に答える