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

时间:2018-03-20 22:38:11

标签: c linux c++11 signals sigint

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

$ ./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("ending\n");
    //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);

1 个答案:

答案 0 :(得分:1)

引用man signal

  

SIGSTOP无法被捕获或忽略。

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

这不准确,但我想你的锻炼可以很好。

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