如何阻止Linux“读取”系统调用阻塞?

时间:2014-07-31 14:22:54

标签: c++ linux system-calls

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

3 个答案:

答案 0 :(得分:2)

呼叫

fcntl(fd, F_SETFL, flags | O_NONBLOCK);

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

答案 1 :(得分:0)

libc read()函数在内核中调用syscall。 (linux)内核区域通常不支持中止,因为它的设计(是的,这可以使进程在某些情况下不可用)

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

答案 2 :(得分:0)

我将假设读取呼叫正在等待数据变为可用并因此而阻塞。

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

    #include <sys/ioctl.h>

    ...

    int count;
    ioctl(file_descriptor, FIONREAD, &count);