Как остановить процесс через согласованный промежуток времени, чтобы выполнить функцию измерения?

Я использую 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 секунд до завершения дочернего процесса.

2 ответа

Решение

Почему бы просто не просто спать N секунд, затем сделайте measure вызов? Если вы установите SIGCHLD обработчик, чтобы поймать, когда дочерний процесс завершается, то, например, sleep будет прервано и вернет количество оставшихся секунд.

Что-то вроде

signal(SIGCHLD, sigchld_handler);

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

waitpid(...);

Я считаю, что это нужно изменить:

setjmp(env); // env - это значение jum_buf

затем

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

если флаг == 1; Я знаю код вызова sig_handler и обратно.

Другие вопросы по тегам