Mihai Sprinceana
Un forum de programare cu de toate. Va astept sa va inscrieti si sa deveniti moderatori. Oricine este binevenit aici sa se inscrie si sa aiba acces la informatie free! Fiecare este liber sa adauge proiecte programe free etc. Ajutati acest forum sa devina o comunitate puternica unde fiecare invata de la fiecare! Tot ce trebuie sa faceti este sa va inregistrati si fiecare contributie se poate dovedi utila in timp! Forumul este free informatia free dk aveti timp liber ajutati si pe ceilalti si invatati si voi in acelasi timp! Haideti sa facem ceva pt.a ne ajuta intre noi! Cititi regulament postare forum inainte de a posta!
Lista Forumurilor Pe Tematici
Mihai Sprinceana | Inregistrare | Login

POZE MIHAI SPRINCEANA

Nu sunteti logat.
Nou pe simpatie:
Profil Sabina
Femeie
22 ani
Bucuresti
cauta Barbat
22 - 60 ani
Mihai Sprinceana / SO Linux&Unix / Probl.semnale- Comunicare 2 procese folosind kill() si signal() Moderat de Cristy89, Houssey, cr3us, fireratbat, profu.info, sade5000
Autor
Mesaj Pagini: 1
mihaispr
Administrator

Inregistrat: acum 16 ani
Postari: 2142
/*Primul program ce ilustreaza modul īn care pot comunica 2 procese
folosind kill() si signal().
Fork() creeaza procesul copil din procesul parinte. Procesul copil ia apoi
semnalele signal() apeleaza functiile adecvate. Īn exemplul de mai jos vom
face apel de sistem fork() la 2 procese si vom lasa parintele sa trimita cāteva
semnale copiilor sai. Pe scurt functia signal() trateaza semnalele respective*/

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

void sighup(); //rutinele copilului care se apeleaza dupa sigtrap
void sigint();
void sigquit();

main()
{ int pid; // ia id-ul procesului copil
if ((pid = fork()) < 0)
{ perror("fork" );
exit(1);
}
if (pid == 0)
{ //procesul copil
signal(SIGHUP,sighup);
//setare apeluri functii
signal(SIGINT,sigint);
signal(SIGQUIT, sigquit);
for(;; ); //bucla infinita
} else
//procesul parinte
{ //stocheaza id-ul procesului copil
printf("\nParintele : trimite semnalul SIGHUP\n\n" );
kill(pid,SIGHUP);
sleep(3); // pauza de 3 secunde
printf("\nParintele: trimite semnalul  SIGINT\n\n" );
kill(pid,SIGINT);
sleep(3); // pauza de 3 secunde
printf("\nParintele: trimite semnalul SIGQUIT\n\n" );
kill(pid,SIGQUIT);
sleep(3);
}
}

void sighup()
{ signal(SIGHUP,sighup); //resetare semnal
printf("CHILD: Am primit semnalul SIGHUP\n" );
}

void sigint()
{ signal(SIGINT,sigint); //resetare semnal
printf("CHILD: Am primit semnalul SIGINT\n" );
}

void sigquit()
{ printf("My DADDY has Killed me!!!\n" );
exit(0);
}


/*Al doilea program foloseste functia raise(). Aceasta are urmatorul prototip:
int raise(int sig). Daca aceasta functie este executata cu succes, semnalul specificat īn sig este generat. Daca programul are un handler de semnal semnalul va fi procesat de handler-ul de semnal. Daca apelul este fara succes functia raise() returneaza o valoare diferita de 0.*/

void  main(void)
{ long  fact;
     printf("Calcul factorial:\n\n" );   
signal(SIGUSR1, SIGhandler);  // instaleaza handler-ul pentru SIGUSR1
  for (prev_fact = i = 1; ; i++, prev_fact = fact)
{ fact = prev_fact * i;    // calcul factorial             
    if (fact < 0)            // if the results wraps around   
             raise(SIGUSR1);     // avem overflow,afiseaza-l     
        else if (i % 3 == 0)     // altfel , afiseaza valoare   
            printf("     %ld! = %ld\n", i, fact);   
}
}

/* Al treilea program este un exemplu pentru functia kill(). Un proces parinte creeaza un proces fiu(copil) prin apelul fork() si asteapta ca acesta sa-si termine initializarea.Procesul copil ii spune parintelui cānd este gata trimitānd semnalul SIGUSR1 folosind functia kill()

Optiuni kill:

kill pid ... -Trimite semnalul SIGTERM pentru fiecare proces listat
kill signal pid ... -Trimite un semnal fiecarui proces listat
kill -s signal pid ... -Trimite un semnal fiecarui proces listat
kill -l - Listeaza numele tuturor semnalelor
kill -l signal  -Converteste un numar al semnalului īntr-un nume
*/

#include <signal.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

//Cānd semnalul SIGUSR1 ajunge seteaza aceasta variabila
volatile sig_atomic_t usr_interrupt = 0;
void synch_signal (int sig)
{ usr_interrupt = 1;
} //Procesul copil executa aceasta functie

void child_function (void)
{ //Initializare
printf ("I'm here!!! My pid is %d.\n", (int) getpid ());
/* Lasa procesul parinte sa stie ca ai terminat. */
kill (getppid (), SIGUSR1); /*
Continua executia. */
puts ("Bye, now...." );
exit (0);
}
int main (void)
{ struct sigaction usr_action;
sigset_t block_mask;
pid_t child_id; /* stabilirea semnalului handler. */
sigfillset (&block_mask);
usr_action.sa_handler = synch_signal;
usr_action.sa_mask = block_mask;
usr_action.sa_flags = 0;
sigaction (SIGUSR1, &usr_action, NULL);
/* Create the child process. */
child_id = fork ();
if (child_id == 0)
child_function (); /* nu intoarce valoare. */
/* stare busy -asteapta ca procesul copil sa trimita un semnal. */
while (!usr_interrupt) ; /* Now continue execution. */
puts ("That's all, folks!" );
return 0;
}


pus acum 15 ani
   
Pagini: 1  

Mergi la