c - 读取命名管道导致无限循环

标签 c linux named-pipes

我有两个使用命名管道的简单程序,这是第一个:

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");
       }
   }
  }
}

第二个

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;
}

在第二个程序中,我给了他要写入的 fifo 的名称和文件的名称,在第一个程序中,我读取了名称和文件名的长度,计算字节数并将其写入日志文件。

但是有一个问题,如果我尝试向 fifo 写入例如一个文件名,第一个程序读取名称和长度 ok,执行计数但之后他一直读取相同的文件名来自 fifo。他的行为就像他没有删除从 fifo 读取的消息一样。这是什么原因?

最佳答案

您没有处理 read() 返回 0 的情况,这意味着没有更多数据并且另一端已关闭管道。

所以如果 read() 也返回 0,你的代码应该停止循环,而不仅仅是当它返回 -1 时

关于c - 读取命名管道导致无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10563732/

相关文章:

c - 为什么最终指针要与 int 的大小对齐?

c - 如何将标准输出重定向到文件——这段代码有什么问题?

java - 从基于 Java 的 Eclipse 插件与独立 C 程序通信的最佳方式

c - 如何在C中向后打印一个单词

关于指向固定数组的指针的混淆

linux - 最佳鱿鱼日志文件分析工具

c++ - 命名管道无法第二次连接

opencv - 从 ffmpeg 流式传输视频并使用 OpenCV 捕获

c - 一元 '*' 的无效类型参数(有 int?

python - 使用 VLC 捕获视频,并将帧保存为 jpeg,怎么样?