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