【问题标题】:How to stop Linux "read" system call from blocking?如何阻止Linux“读取”系统调用阻塞?
【发布时间】:2014-07-31 14:22:53
【问题描述】:

如何在 C++ 中解除读取 Linux 系统调用的阻塞?例如,如果我在一个线程中有以下循环 :

bool shouldRun;

void foo(){
  while(shouldRun){
    length = read( file_descriptor, buffer, buffer_length);
    //do something
  }
  return;
}

main(){
  shouldRun = true;
  std::thread myThread(foo);
  //do some other stuff
  shouldRun = false;
  //-->here I want to unblock "read" in foo
}  

一般read方法应该阻塞,我只想在需要的时候解除阻塞。

【问题讨论】:

  • 如何中止任何函数调用?
  • @dandan78 我不明白你的评论。请澄清。编辑:我同意,在这里取消阻止可能是一个更好的分类法。
  • 从另一个线程关闭文件描述符?
  • 您可以pthread_kill() 线程,前提是您在线程中正确配置了给定的信号。因此对read() 的调用将返回错误EINTR

标签: c++ linux system-calls


【解决方案1】:

打电话

fcntl(fd, F_SETFL, flags | O_NONBLOCK);

这将使文件描述符非阻塞。

【讨论】:

  • '一般read方法应该阻塞,我只想在需要的时候解除阻塞'
  • 当您希望再次阻止该标志时,您可以随时清除该标志。或者,您可以使用零超时的 select 或 poll 来查看文件描述符是否会阻塞,如果文件描述符不会阻塞,则仅调用 read。
【解决方案2】:

libc read() 函数在内核端内部调用系统调用。 (linux) 内核区域由于其设计原因通常不支持中止(是的,在某些情况下,这会使进程不可终止)

要归档您的目标,您应该使 read() 非阻塞,以便内核调用立即返回,或者使用 select() 在 read() 之前检查数据是否准备好。

【讨论】:

    【解决方案3】:

    我将假设 read 调用正在等待数据可用,因此它被阻塞了。

    这就是为什么我建议您在阅读之前检查数据是否可用:

        #include <sys/ioctl.h>
    
        ...
    
        int count;
        ioctl(file_descriptor, FIONREAD, &count);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-09
      • 2020-09-14
      • 2015-05-24
      • 1970-01-01
      • 1970-01-01
      • 2014-11-17
      • 1970-01-01
      • 2020-11-11
      相关资源
      最近更新 更多