【发布时间】:2014-05-08 10:03:35
【问题描述】:
我正在从事涉及大量信号处理和虚拟化的遗留应用程序开发。我很难理解下面提到的场景......
程序流程:
(A) SIGTRAP -> (B) 进程 -> (C) SIGTRAPHANDLER -> (D) foo() [在 libfoo 中实现的功能] -> (E) 向内核发送消息(通过 NETLINK 套接字)-> (F ) 返回
(A) is the sigtrap signal which is sent to process1
(B) is the normal user space process
(C) is the sigtrap handler invoked upon sigtrap signal
(D) foo() function is invoked under sigtrap handler and the function implemention is in libfoo library
(E) Upon the invocation of foo() function , message is send to query x() data from kernel thru netlink socket
(F) Successful message reply
在这里,在事件 (F) 处,如果未收到消息回复,则进程 (B) 将永远停止,从而导致依赖于 (B) 的所有其他进程失败。
到目前为止,我尝试使用 alarm() 中断信号,但这无助于恢复程序执行,而是只能将 alarm() 视为恢复/清理的东西。
有人可以帮助我了解如何恢复程序执行(在进程 B 上下文中)吗?
对不起,如果解释不清楚和准确。
平台:Linux、C
int main() {
bind_sigtrap_hand();
bind_sigalarm_hand();
bind_handler_for_others();
}
bind_sigtrap_hand() {
sa.sa_handler = invoke_me_sigtrap;
if (sigaction(SIGTRAP, &sa, NULL) != 0)
{
//Error
}
}
bind_sigalarm_hand() {
sa.sa_handler = invoke_me_sigalarm;
if (sigaction(TIMER_SIGNAL, &sa, NULL) != 0)
{
//Error
}
}
void invoke_me_sigtrap(sig stuff)
{
if (SIGTRAP == sendsys){
sendsyscall();
}
}
在这里,在上面的示例中,sendsyscall() 在内核内存区域中执行 X 操作,该操作经常在 sigtrap 下停止。在这里,哪种信号/警报有助于恢复进程(不杀死)到正常执行。
【问题讨论】:
-
你应该展示一些源代码。否则你的解释不够清楚!
-
@BasileStarynkevitch 谢谢巴西尔。端到端代码非常大。所以试图捕捉上面更新的问题框中的伪代码。你/大家能帮我吗?
标签: c linux signals powerpc signal-handling