我有一个C代码,它使用对文件描述符的阻塞I / O调用,其中一些是磁盘FD,因此我无法使用select()
,但有些I / O调用(read()
/ write()
)被阻止几秒钟。
如果系统调用阻塞超过指定的时间阈值(例如500miliSec),是否可以中止系统调用?
我不愿意使用非阻塞I / O调用,因为我正在记录I / O失败计数并在计数超过限制时终止进程,并且非阻塞I / O快速获取I / O错误超过门槛。
答案 0 :(得分:1)
没有通用的方法来设置阻塞文件描述符的超时,但是如果您正在处理套接字,则可以使用套接字选项。
另一种方法是设置闹钟。这将在它到期时发出一个信号,你可以用来关闭套接字并产生必要的错误。
答案 1 :(得分:0)
答案是针对操作系统的,因为C ++不抽象线程终止。
请注意,只能通过中断机制在飞行途中杀死函数。在线程被TerminateThread
标记为删除之后,在经过一定的微秒(由NT中断延迟命令控制)之后,OS将获得对执行线程的CPU的控制。实际上很难将其降低到500微秒,此外,延迟会因系统而异。请参阅DPC延迟和DPC Latency Checker等工具。
此外,我怀疑IO句柄会发生可怕的事情,这意味着后续命令可能会导致错误。
#include <thread>
#include <iostream>
#include <windows.h>
int main(int argc, char *argv[])
{
auto thread_to_run_the_command_on = std::thread( [] {
std::cout << "Started" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(5));// Your function goes here
std::cout << "Never Called" << std::endl;
// thread floats away into the aether, also RAII is violated for objects in this scope
});
//give it some time to start
std::this_thread::sleep_for(std::chrono::seconds(3));
const auto windows_native_thread_handle = thread_to_run_the_command_on.native_handle();
TerminateThread(windows_native_thread_handle, 0);
thread_to_run_the_command_on.detach();
}