/* signali.c
 *
 * Operacijski sustavi -- vjezba 1, zadatak 1
 *
 * Rijesio:
 * Filip Niksic (fniksic@gmail.com)
 * 2008-05-21
 **/

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>

void sigQuit_handler(int sig) {
    int i;

    printf("Pocetak obrade prekida SIGQUIT\n");
    for (i = 1; i <= 10; ++i) {
	printf("Obrada prekida SIGQUIT (%d/10)\n", i);
	sleep(1);
    }
}

void sigTermStop_handler(int sig) {
    int i;

    printf("Pocetak obrade prekida SIGTSTP\n");
    for (i = 1; i <= 10; ++i) {
	printf("Obrada prekida SIGTSTP (%d/10)\n", i);
	sleep(1);
    }
}

int main(void) {
    int i;
    struct sigaction sigQuit;
    struct sigaction sigTermStop;

    /* Inicijaliziramo strukture za hvatanje signala */
    sigQuit.sa_handler = sigQuit_handler;
    sigemptyset(&sigQuit.sa_mask);
    sigQuit.sa_flags = 0;

    sigTermStop.sa_handler = sigTermStop_handler;
    sigemptyset(&sigTermStop.sa_mask);
    sigTermStop.sa_flags = 0;

    /* Trosimo vrijeme prije postavljanja handlera za signale */
    for (i = 1; i <= 10; ++i) {
	printf("Glavni program - pocetak (%d/10)\n", i);
	sleep(1);
    }

    /* Postavljamo handlere */
    if (sigaction(SIGQUIT, &sigQuit, NULL) == -1) {
	printf("Greska prilikom inicijalizacije SIGQUIT!\n");
	return EXIT_FAILURE;
    }
    else
	printf("SIGQUIT inicijaliziran (Ctrl+\\)\n");

    if (sigaction(SIGTSTP, &sigTermStop, NULL) == -1) {
	printf("Greska prilikom inicijalizacije SIGTSTP!\n");
	return EXIT_FAILURE;
    }
    else
	printf("SIGTSTP inicijaliziran (Ctrl+Z)\n");

    /* Trosimo vrijeme dok korisnik isprobava slanje signala... */
    for (i = 1; i <= 100; ++i) {
	printf("Glavni program (%d/100)\n", i);
	sleep(1);
    }

    return EXIT_SUCCESS;
}
