0

我正在编写的分析器中使用 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 秒运行一次测量函数,直到子进程退出。

4

2 回答 2

3

为什么不简单地睡N几秒钟,然后measure打电话呢?如果您安装一个SIGCHLD处理程序来捕获子进程退出时,那么 egsleep将被中断并返回剩余的秒数。

就像是

signal(SIGCHLD, sigchld_handler);

do
{
    measure();
} while (sleep(N) == 0);

waitpid(...);
于 2013-07-25T13:44:49.480 回答
0

我只发现这个需要改变:

setjmp(env);// env 是一个 jum_buf 值

然后

longjmp(env,1);// so if necessary, we can use :int flag = setjum(env); 

如果标志 == 1; 我知道代码调用 sig_handler 并返回。

于 2013-07-25T13:43:41.287 回答