我需要制作一个程序,其中该过程无限期地写入三个点。当按 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);
答案 0 :(得分:1)
引用man signal
,
SIGSTOP
无法被捕获或忽略。
我看到的唯一解决方案是轮询当前时间,并测量当前和之前样本之间的差值。足够大的差异很可能表明程序已经停止。
这不准确,但我想你的锻炼可以很好。
PS:信号处理程序中不要printf
。