Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <signal.h>
- #include <setjmp.h>
- #include <time.h>
- #define LENGTH 1000
- // область памяти для запоминания состояния процесса
- sigjmp_buf buffer;
- // счетчик количества пришедших прерываний SIGINT
- int count_int = 10;
- int main() {
- void callBack13(); // имя функции обработки прерывания
- char data[LENGTH+1]; // буфер для считывания информации из канала
- int vv; // флаг завершения работы программы
- int gg = 0;
- int g[2]; // дескрипторы межпроцессного канала g[0] - для чтения, g[1] - для записи
- // обнуляем буфер для считывания информации из канала
- for(int i=0; i<=LENGTH; ++i) {
- data[i] = '\0';
- }
- signal(SIGINT, callBack13); // уведомление, что в случаем SIGINT выполнять callBack13
- sigsetjmp(buffer, 1); // сохранить текущее состояние процесса в буфер
- vv = 0;
- do {
- sigsetjmp(buffer, 1);
- pipe(g);
- if(fork() == 0) { // child
- close(1); // закрываем стандартный вывод
- close(g[0]); // закрываем межпроцессный канал на чтение
- dup2(g[1], 1); // дублирование дескриптора канала на стандартный вывод
- close(g[1]); // удалить копию
- // выполнение команды, результаты направляются в межпроцессный канал
- execl("/usr/bin/w", "w", "-hs", NULL);
- exit(0); // завершить выполнение процесса-потомка
- }
- else { // parent
- pid_t cpid = wait(NULL); // ожадение окончания процесса потомка
- // вывод pid потомка и родителя
- printf("Parent pid = %d, child pid = %d\n", getpid(), cpid);
- // сохранение состояния процесса
- sigsetjmp(buffer, 1);
- close(g[1]);
- // считывание данных из межпроцессного канала
- read(g[0], data, LENGTH);
- char username[33]; // строка для хранения имени пользователя
- for(int i=0; i<33; ++i) {
- username[i] = '\0';
- }
- // выделяем имя пользователя из данных
- int j = 0;
- for(int i=0; i <= LENGTH && data[i] != '\0'; ++i) {
- if(data[i] == ' ') {
- if (username[0] != '\0') { // строка не пустая
- username[j] = '\0';
- printf("%s\n", username); // выводим имя пользователя
- username[0] = '\0';
- sleep(1);
- }
- } else if (j < 32) {
- username[j++] = data[i];
- } else if (data[i] == '\n') {
- j = 0;
- }
- }
- }
- } while(vv);
- sigsetjmp(buffer, 1);
- printf("Good night, sweet prince!\n");
- return 0;
- }
- // функция обработки сигнала SIGINT
- void callBack13() {
- count_int --;
- signal(SIGINT, callBack13);
- if(count_int <= 0) { // если прерывания произошли 10 раз, то выйти из программы
- printf("Good bye!\n");
- exit(1);
- }
- time_t rawTime;
- struct tm* timeInfo;
- time(&rawTime); // получить текущее время
- timeInfo = localtime(&rawTime); // преобразовать его в локальный формат
- printf("Get interrupt at %s", asctime(timeInfo)); // вывести сообщение о получении прерывания
- printf("%d times left\n", count_int); // сколько раз осталось
- siglongjmp(buffer, 1); // восстановить состояние процесса к последнему сохраненному
- }
Advertisement
Add Comment
Please, Sign In to add comment