信号 - 使用 CTRL-C 终止进程并使用 CTRL-Z 停止进程 + 测量时间



我需要制作一个程序,其中进程无限期地写入三个点。当按 CTRL+C(使用 SIGINT(时,程序需要写入再见消息并终止进程。当按 CTRL+Z 然后按 fg(使用 SIGCONT(时,程序需要测量这段时间内经过的时间(以秒为单位(,并且每经过一秒,程序需要写入一个点。当程序写入 1 的所有点时,它会返回到三个点。

$ ./program
...
...
...
...
... <pressing Ctrl+Z>
$ <we wait few seconds (5)>
$ fg
.
.
.
.
.
...
...
...
...
<pressing Ctrl+C>
Ending
$

我设法完成了第一部分(在无限循环中使用 CTRL+C 杀死进程(,但我找不到使用 CTRL+Z 停止进程然后继续使用 fg 后测量时间的方法。

当前工作代码:

bool stop = true;
void end(int sig){
    printf("endingn");
    //signal(SIGINT, SIG_DFL);
    //kill(getpid(), SIGINT);
    stop = false;
}
int main(){
    struct sigaction act;
    act.sa_handler = end;
    sigemptyset(&act.sa_mask);
    act.sa_flags = 0;
    sigaction(SIGINT, &act, 0);
    while(stop) {
        printf("...n");
        sleep(1);
    }
    return 0;
}

我计划如何测量时间:

t = clock();
pause();
t = clock() - t;
double time = ((double)t)/CLOCKS_PER_SEC;
printf("time: %f", time);

引用man signal

SIGSTOP不能被抓住或忽视。

我看到的唯一解决方案是轮询当前时间,并测量当前样本和上一个样本之间的增量。差异足够大很可能表明程序已停止。

这并不精确,但我想对于你的锻炼来说已经足够好了。

PS:不要printf信号处理程序。

最新更新