Сигналы - убить процесс CTRL-C и остановить процесс CTRL-Z + замерить время

Мне нужно сделать программу, где процесс бесконечно пишет три точки. При нажатии 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);

person GouzdniJouza    schedule 20.03.2018    source источник
comment
Опубликуйте минимальный, полный и проверяемый пример. И добро пожаловать в StackOverflow!   -  person Adriano P    schedule 21.03.2018
comment
Извините я забыл. Добавлен. И спасибо.   -  person GouzdniJouza    schedule 21.03.2018


Ответы (1)


Цитирую man signal,

SIGSTOP нельзя поймать или проигнорировать.

Единственное решение, которое я вижу, - это опросить текущее время и измерить дельту между текущим и предыдущим образцом. Достаточно большая разница, скорее всего, указывает на то, что программа была остановлена.

Это не точно, но я думаю, что для вашего упражнения может быть достаточно.

PS: не printf в обработчике сигнала.

person user58697    schedule 20.03.2018
comment
Да, но где мне пометить меру времени? Я пытаюсь измерить время с помощью библиотек time.h. Но я не знаю, куда его положить. - person GouzdniJouza; 21.03.2018