如何阻止 Linux "read"系统调用阻塞?
How to stop Linux "read" system call from blocking?
如何在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);
相关文章:
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- 如果整个应用程序是虚拟映射的,为什么 new 会进行系统调用?
- 如何将C++系统调用连接到 freertos
- 如何使用 C/C++ 和 system() 系统调用以外的其他方法在 Linux 中获取文件功能?
- 系统调用:一次和多次,哪个更好?
- 使用路径和空格的系统调用
- 是否有等效于 macOS 上的 clone() 系统调用?
- 从C++调用系统调用节点?
- C++测试程序中的非法系统调用(对角矩阵元素程序的总和)
- 英特尔 Pin:如何获取系统调用的返回地址
- 如何使用低级系统调用从 stdin 和输入文件中获取字节数
- 使用模拟器C++从RISC-V裸机程序调用printf系统调用时失败
- 动态执行的 ARM ASM 系统调用,可从C++重新定位
- 如何知道我正在使用的Linux OS是否具有特定的系统调用
- 当C 中的系统调用conconculables时,参数字符串中的字符损失
- 调用系统调用函数时出现异常
- 在 boost::asio 中自定义套接字/关闭系统调用
- 系统调用失败"Incorrect Section Name -e" C++
- 像 read() 、write() 这样的函数调用在 Linux 中是实际的系统调用吗?
- 如何阻止 Linux "read"系统调用阻塞?