Как остановить процесс через согласованный промежуток времени, чтобы выполнить функцию измерения?
Я использую 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 и обратно.