/* tasakello3 */ /* ei toista aikaa */ /* toimii HP-UXissa ja Linuxissa */ #include #include #include #include #include #include jmp_buf env; void inthandler(sig) { sigset_t set; printf("\nHaluatko todella lopettaa? (k/e) "); while (1) { switch(getchar()) { default: printf("\nVastaa k tai e "); continue; case 'k': case 'K': printf("OK, hei hei\n"); exit(EXIT_SUCCESS); case 'e': case 'E': printf("Hienoa, jatketaan\n"); /* HP-UXissa handler on asetettava uudestaan */ if (signal(SIGINT, inthandler) == SIG_ERR) { perror("signal"); exit(EXIT_FAILURE); } /* Linuxissa signaalin blokkaus on poistettava */ sigemptyset(&set); sigaddset(&set, SIGINT); sigprocmask(SIG_UNBLOCK, &set, NULL); longjmp(env,1); } } } int main() { time_t unixaika; struct tm *aika; setjmp(env); if (signal(SIGINT, inthandler) == SIG_ERR) { perror("signal"); exit(EXIT_FAILURE); } while(1) { unixaika=time(NULL); aika = localtime(&unixaika); sleep( 10 - (aika->tm_sec)%10); unixaika=time(NULL); aika = localtime(&unixaika); printf("%02d:%02d:%02d\n", aika->tm_hour, aika->tm_min, 10*(aika->tm_sec/10)); } }