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 |
|
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 |
|