Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C linux读取系统调用未获得EOF_C_Linux_Io_Pipe_Eof - Fatal编程技术网

C linux读取系统调用未获得EOF

C linux读取系统调用未获得EOF,c,linux,io,pipe,eof,C,Linux,Io,Pipe,Eof,首先,如果我的英语不够流利和清晰,我很抱歉 我正在努力理解管道和流程之间的通信。我尝试实现了两个c程序,一个从标准输入中读取的内容写入到某个管道中,另一个等待管道打开并从中读取,然后打印到标准输出,直到EOF 以下是编写器管道的代码: fd = open(filename, O_RDWR); if(fd == -1) print_error(); while(fgets(buffer, BUFFER_SIZE, stdin) != NULL) { if(write(fd,

首先,如果我的英语不够流利和清晰,我很抱歉

我正在努力理解管道和流程之间的通信。我尝试实现了两个c程序,一个从标准输入中读取的内容写入到某个管道中,另一个等待管道打开并从中读取,然后打印到标准输出,直到EOF

以下是编写器管道的代码:

  fd = open(filename, O_RDWR);
  if(fd == -1) print_error();

  while(fgets(buffer, BUFFER_SIZE, stdin) != NULL) {
    if(write(fd, buffer, BUFFER_SIZE) == -1) print_error();
  }
下面是读卡器管道的代码:

while(1) {
    if((fd = open(filename, O_RDWR)) == -1) {
      if(errno == ENOENT) sleep(1);
      else print_error();
    }
    else {
      while(read(fd, buffer, BUFFER_SIZE) != 0) {
        fprintf(stdout, "%s", buffer);
      }
    }
  }
问题是,当我同时运行这两个程序时,基本概念起作用了,我在writer程序中向标准输入写入一些东西,在另一个终端中,我看到reader程序将其打印到标准输出。问题是,当我为编写程序按CTRL+D发送EOF时,读取器程序仍在等待输入,我确信这不是因为在while(1)中,我在调试器中看到read syscall只是在等待输入,不知道我们得到了EOF,行:
read(fd,buffer,buffer\u SIZE)
即使没有输入,也没有计算

我希望我提供了解决问题所需的所有数据,有人知道哪里出了问题吗?

如果
fgets()
检测到
EOF
它会返回其读取缓冲区中已经存在的内容,或者只返回
NULL

在后一种情况下,您希望通过关闭管道等方式通知读取端传输已结束

  int fd = open(filename, O_RDWR);
  if (fd == -1) 
  {
    perror("open() failed");
  }
  else
  {    
    while (fgets(buffer, BUFFER_SIZE, stdin) != NULL) 
    {
      if (write(fd, buffer, BUFFER_SIZE) == -1) 
      {
        perror("write() failed");
        break;
      }
    }
    if (ferror(stdin))
    {
       perror("fgets() failed");
    }

    close(fd); /* The other end's blocking call to read() would return 0. */
  }
在任何情况下,都不会读取类似于
EOF
的内容<代码>EOF不是字符,而是状态

发件人:

如果某个进程将管道打开以进行写入[…]
read()
将阻止调用线程,直到写入某些数据或所有具有管道的进程关闭管道 开放写作


此外,此代码不包括
read()
故障:

  while(read(fd, buffer, BUFFER_SIZE) != 0) {
    fprintf(stdout, "%s", buffer);
  }
例如,它应该如下所示:

  ssize_t result;
  while (0 != (result = read(fd, buffer, BUFFER_SIZE))) 
  {
    if (0 > result)
    {
      if ((EINTR == errno) || (EAGAIN == errno)) 
      {
        continue;
      }

      perror("read() failed");
      break;
    }

    fprintf(stdout, "%s", buffer);
  }

更是这个循环

while(1) {
  if((fd = open(filename, O_RDWR)) == -1) {
    if(errno == ENOENT) sleep(1);
    else print_error();
  }
  ...
}
。。。在(重新)打开之前,未命中到
close()
fd



如果读卡器未写入,则通过指定
O_RDONLY
而不是
RDWR
read
也可以在出错时返回
-1
,让读卡器打开管道。如果编写器进程没有正确关闭其输出流,则可能会出现这种情况。因此,您应该明确检查read
首先感谢您提供的详细答案,问题是在程序结束时,我确实关闭了管道,但没有任何帮助。还有其他想法吗?请看我更新的答案,为阅读提供了一个更健壮的代码片段@C.Merabishmulikok,我正在检查,没有错误。问题是,我确信writer程序关闭了管道。另一个使用管道的进程是reader程序,有没有可能因为他我在等待?reader进程也会打开管道进行写作。仔细阅读手册页:“……或者所有打开管道进行写入的进程都关闭了管道。”OHHHH!这是有道理的,我现在就去修。谢谢!这不是问题所在,但还是要谢谢你的帮助。