我正在编写的探查器中使用Linux ptrace API。
我的伪C代码如下所示:
setjmp();
measure();
alarm(N);
while(1) {
waitpid(child, &status, WNOHANG);
if(child_process_exiting) {
measure();
break;
}
}
警报信号处理程序如下:
void sig_handler(int sig) {
signal(SIGALRM, sig_handler);
longjmp(env, 0);
}
我想反复返回setjmp调用,直到子进程退出并中断循环。目标是每N秒运行一次度量函数,直到子进程退出。
答案 0 :(得分:3)
为什么不简单地只睡N
秒,然后进行measure
通话?如果你安装一个SIGCHLD
处理程序来捕获子进程何时退出,那么例如sleep
将被中断并返回剩余的秒数。
像
这样的东西signal(SIGCHLD, sigchld_handler);
do
{
measure();
} while (sleep(N) == 0);
waitpid(...);
答案 1 :(得分:0)
我只发现需要改变:
setjmp(env);
// env是一个jum_buf值
然后
longjmp(env,1);// so if necessary, we can use :int flag = setjum(env);
如果flag == 1;我知道代码调用sig_handler并返回。