我有阻塞任务,将由find_the_question()函数执行.但是,我不希望线程执行此函数需要超过10秒.因此,如果它需要超过10秒,我想关闭该线程清理所有资源.
我尝试为此编写代码,但不知何故,如果线程占用时间超过10秒,我无法在find_the_question()函数中获得中断.你能告诉我我做错了什么吗?
void find_the_question(std::string value)
{
//allocate x resources
try{
//do some process on resources
sleep(14);
//clean resources
}
catch(boost::thread_interrupted const& )
{
//clean resources
std::cout << "Worker thread interrupted" << std::endl;
}
}
int main()
{
boost::posix_time::time_duration timeout = boost::posix_time::milliseconds(10000);
std::cout << "In main" << std::endl;
boost::thread t1(find_the_question, "Can you block me");
t1.interrupt();
if (t1.timed_join(timeout))
{
//finished
std::cout << "Worker thread finished" << std::endl;
}
else
{
//Not finished;
std::cout << "Worker thread not finished" << std::endl;
}
std::cout …
Run Code Online (Sandbox Code Playgroud) boolean cancel(boolean mayInterruptIfRunning)
Run Code Online (Sandbox Code Playgroud)
尝试取消执行此任务.如果任务已完成,已取消或由于某些其他原因无法取消,则此尝试将失败.如果成功,并且在调用cancel时此任务尚未启动,则此任务永远不会运行.如果任务已经启动,则mayInterruptIfRunning参数确定执行此任务的线程是否应该在尝试停止任务时被中断.
我的问题是,如果mayInterruptIfRunning为false,取消会怎么做?
如果任务已经运行,它如何取消或停止执行?
这是一个成功发送()"原子"的后续问题?,我认为它实际上涉及系统调用,而不仅仅是发送套接字.
哪些系统调用可以中断,何时中断处理中断?我已经了解了SA_RESTART,但并不完全了解发生了什么.
如果我在没有SA_RESTART的情况下进行系统调用,是否可以通过与我的应用程序无关的任何类型的中断(例如用户输入)来中断调用,但要求操作系统中止我的呼叫并执行其他操作?或者它只是被与我的进程直接相关的信号中断(CTRL + C,套接字关闭,......)?
设置SA_RESTART时,send()或任何其他"慢"系统调用的语义是什么?它是否会一直阻塞,直到我的所有数据都被传输或套接字关闭,或者它是否能以小于send()参数中的计数的数字返回?
重启的实施在哪里?操作系统是否知道我希望在任何中断时重新启动调用,或者是否有一些信号发送到我的进程然后由库代码处理?或者我必须自己做,例如在while循环中包装调用并根据需要重试?
我正在开发一个利用关闭挂钩的Java应用程序,以便清除程序的终止/中断,但我注意到Cygwin的CTRL-C实现似乎没有触发关闭挂钩.从表面上看,似乎已中断了该过程,将控制权交还给命令行,但是根本不会触发进程的"关闭"挂钩,因此不会发生清理.
在cmd中它们被捕获,但由于各种约束,我需要以某种方式让它们在Cygwin中工作.
有什么方法可以通过Cygwin在正在运行的进程中触发SIGINT,或者可能是我可以用来清理中断和终止的关闭挂钩的替代方法?
我想编写一个劫持实时时钟(中断8)的LKM(Linux内核模块).所以我希望将中断设置为我的函数,并在某些时候将其发送回旧函数.
我试图使用该request_irq
函数没有任何成功,可能是因为那里的内核函数不愿意共享中断(我猜这是一个很好的决定).
根据我发现的一些页面,我还尝试编辑IDT(中断描述符表).他们没有工作,大多数甚至没有编译,因为他们为内核2.6编写,我正在使用3.10.
这是一个简化的代码,我只是想让你知道我在做什么.
kpage =__get_free_page( GFP_KERNEL);
asm("sidt %0": : "m"(*idtr) : );
memcpy(kpage, idtr, 256*sizeof(kpage));
newidt = (unsigned long long *)(*(unsigned long*)(idtr+1));
newidt[8] = &my_function;
asm("lidt %0": "=m"(newidt):);
Run Code Online (Sandbox Code Playgroud)
我的所有尝试都是在分段故障的好时候结束,并且在内核崩溃的困难时期迫使我重新启动(幸运的是我使用虚拟机和快照).
那么我怎么能劫持实时中断所以它能完成我的工作呢?(然后将其发送回原始函数以执行.)
这是一些很好的代码来改变IDT上的pagefault函数.我无法使它工作,因为它也是为内核2.6编写的.这个问题也值得研究.
要获得赏金,请发布工作代码,或者至少提供足够的信息以使其运行.
我知道有进程上下文和中断上下文但我不明白在执行softirq或tasklet时,它在哪个上下文中运行.
我看到有些人使用术语"下半部分",如果有这样的术语,与其他人相比有什么不同.
softirq和tasklet的另一个问题是为什么在执行期间不允许睡眠?
谁能帮我识别这些问题,谢谢!!
在mainbord上我们有一个中断控制器(IRC),它作为设备之间的多路复用器,可以引发中断和CPU:
|--------|
|-----------| | |
-(0)------| IRC _____|______| CPU |
-(...)----| ____/ | | |
-(15)-----|/ | |--------|
|-----------|
Run Code Online (Sandbox Code Playgroud)
每个设备都与IRQ(左侧的数字)相关联.每次执行后,CPU都会检测到中断请求线.如果检测到信号,将执行状态保存,并且CPU加载中断处理程序例程,该例程可以在位于存储器中固定地址的中断向量中找到.据我所知,中断向量中的IRQ数和向量数不一样,因为我的网卡已经注册到IRQ 8.在Intel Pentium处理器上,这将指向一个使用的例程发出一个错误信号,因此必须有一个指向正确处理程序的映射.
问题:
1)如果我写一个设备驱动程序并为它注册一个IRQ X. 系统从哪里知道应该处理哪个设备?例如,我可以使用IRQ编号为10的request_irq(),但系统如何知道处理程序应该用于鼠标或键盘,或者用于编写驱动程序的任何内容?
2)中断向量看起来如何?我的意思是如果我将IRQ 10用于我的设备,这将覆盖用于表中错误处理的标准处理程序(根据Silberschatz(操作系统概念),第一个可用的是32).
3)谁最初设置了IRQ?Bios?操作系统?
4)谁负责IRQ与中断向量中的偏移的匹配?
5)可以共享IRQS.怎么可能?主板上有硬件通道,用于将设备连接到中断控制器.如何将通道配置为相同的中断?必须有一个表格,表示第2道和第3道处理IRQ15,例如该表位于何处以及如何调用?
我最近在自定义Linux内核(2.6.31.5,x86)驱动程序中遇到了一个问题,其中copy_to_user会定期不将任何字节复制到用户空间.它将返回传递给它的字节数,表明它没有复制任何东西.代码检查后,我们发现代码在调用copy_to_user时禁用了中断,这违反了它的合同.纠正此问题后,问题就停止了.因为问题很少发生,我需要证明禁用中断会导致问题.
如果你从arch/x86/lib/usercopy_32.c rep看下面的代码片段; movsl通过CX中的计数将单词复制到用户空间.退出时使用CX更新大小.如果movsl正确执行,CX将为0.因为CX不是零,所以movs?为了符合copy_to_user的定义和观察到的行为,指令不得执行.
/* Generic arbitrary sized copy. */
#define __copy_user(to, from, size) \
do { \
int __d0, __d1, __d2; \
__asm__ __volatile__( \
" cmp $7,%0\n" \
" jbe 1f\n" \
" movl %1,%0\n" \
" negl %0\n" \
" andl $7,%0\n" \
" subl %0,%3\n" \
"4: rep; movsb\n" \
" movl %3,%0\n" \
" shrl $2,%0\n" \
" andl $3,%3\n" \
" .align 2,0x90\n" \
"0: rep; movsl\n" \
" movl %3,%0\n" \
"1: rep; …
Run Code Online (Sandbox Code Playgroud) 基本上我想要一个函数被称为每个10毫秒.
我怎样才能在Java中实现这一目标?
我的程序经历了这样的循环:
...
while(1){
read(sockfd,buf,sizeof(buf));
...
}
Run Code Online (Sandbox Code Playgroud)
read函数在等待输入时阻塞,这恰好来自套接字.我想处理SIGINT并且基本上告诉它在读取时停止读取函数然后调用任意函数.做这个的最好方式是什么?