如何阻止 Linux "read"系统调用阻塞?

How to stop Linux "read" system call from blocking?

本文关键字:系统调用 read 何阻止 Linux      更新时间:2023-10-16

如何在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方法应该阻塞,我只想在需要时解除阻塞。

call

fcntl(fd, F_SETFL, flags | O_NONBLOCK);

这将使文件描述符非阻塞

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

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

我将假设read调用正在等待数据变得可用,并因此阻塞。

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

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