Хрестоматия по программированию на Си в Unix




Системные вызовы и взаимодействие с UNIX. Хрестоматия по программированию на Си в Unix - стр. 8


#include <stdio.h>

#include <signal.h>

int got; /* пришел ли сигнал */

void onalarm(int sig) { printf( "Будильник\n" ); got++; } /* сигнал получен */

void sleep(int n){ time_t time(), start = time(NULL); void (*save)(); int oldalarm, during = n;

if( n <= 0 ) return; got = 0; save = signal(SIGALRM, onalarm); oldalarm = alarm(3600); /* Узнать старый заказ */ if( oldalarm ){ printf( "Был заказан сигнал, который придет через %d сек.\n", oldalarm ); if(oldalarm > n) oldalarm -= n; else { during = n = oldalarm; oldalarm = 1; } } printf( "n=%d oldalarm=%d\n", n, oldalarm ); while( n > 0 ){ printf( "alarm(%d)\n", n ); alarm(n); /* заказать SIGALRM через n секунд */

pause();

if(got) break; /* иначе мы сбиты с pause другим сигналом */ n = during - (time(NULL) - start); /* прошло времени */ } printf( "alarm(%d) при выходе\n", oldalarm ); alarm(oldalarm); /* alarm(0) - отмена заказа сигнала */ signal(SIGALRM, save); /* восстановить реакцию */ }

void onintr(int nsig){ printf( "Сигнал SIGINT\n"); signal(SIGINT, onintr); }

void onOldAlarm(int nsig){ printf( "Звонит старый будильник\n"); }

void main(){ int time1 = 0; /* 5, 10, 20 */ setbuf(stdout, NULL); signal(SIGINT, onintr); signal(SIGALRM, onOldAlarm); alarm(time1); sleep(10); if(time1) pause(); printf("Чао!\n"); }

6.4.4. Напишите "часы", выдающие текущее время каждые 3 секунды.

#include <signal.h>

#include <time.h>

#include <stdio.h>

void tick(nsig){ time_t tim; char *s; signal (SIGALRM, tick); alarm(3); time(&tim); s = ctime(&tim); s[ strlen(s)-1 ] = '\0'; /* обрубить '\n' */ fprintf(stderr, "\r%s", s); } main(){ tick(0); for(;;) pause(); }

© Copyright А. Богатырев, 1992-95
Си в UNIX

| |




Содержание  Назад  Вперед