Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <sys/types.h>
- #include <unistd.h>
- #include <signal.h>
- #include <stdlib.h>
- unsigned long total = 0, curent = 0, stp[5], poz = -1, secunde = 0;
- pid_t fiu;
- int p2f[2];
- int pfts[2];
- void calculeazaStatistica(int sig){
- printf("Proces fiu: Am primit SIGUSR1\n");
- poz++;
- stp[poz] = curent;
- total+=curent;
- curent=0;
- }
- void terminaFiu(int sig){
- int i;
- write(pfts[1], &total, sizeof(unsigned long));
- for (i = 0; i < 5; i++){
- write(pfts[1], &stp[i], sizeof(unsigned long));
- }
- close(pfts[1]);
- exit(0);
- }
- void alarma(int sig){
- int i = 0;
- if (secunde == 5){
- kill(fiu, SIGUSR2);
- read(pfts[0], &total, sizeof(unsigned long));
- printf("Fiul s-a terminat. Statistica:\n");
- printf("Numar total de caractere trimis: %ld\n", total);
- while (read(pfts[0], &stp[i], sizeof(unsigned long)) > 0)
- {
- printf("Numar de caractere la secunda %d: %ld\n",i+1, stp[i]);
- i++;
- }
- close(pfts[0]);
- exit(0);
- } else {
- kill(fiu, SIGUSR1);
- secunde++;
- alarm(1);
- }
- }
- int main(void){
- char buf;
- int i;
- if (pipe(p2f) < 0){
- perror("Eroare la pipe");
- exit(1);
- }
- if (pipe(pfts) < 0){
- perror("Eroare la pipe");
- exit(1);
- }
- if ((fiu = fork()) < 0)
- {
- perror("Eroare la fork\n");
- exit(2);
- }
- if (fiu == 0)
- {
- close(p2f[1]);
- close(pfts[0]);
- if (signal(SIGUSR1, calculeazaStatistica) == SIG_ERR)
- {
- perror("Eroare in procesul fiu, la primul apel signal\n");
- exit(1);
- }
- if (signal(SIGUSR2, terminaFiu) == SIG_ERR)
- {
- perror("Eroare in procesul fiu, la al doilea apelul signal\n");
- exit(1);
- }
- while(read(p2f[0], &buf, 1) > 0)
- {
- curent++;
- }
- close(p2f[0]);
- close(pfts[0]);
- exit(0);
- } else
- {
- close(p2f[0]);
- close(pfts[1]);
- if (signal(SIGALRM, alarma) == SIG_ERR){
- perror("Eroare in procesul parinte, la apelul signal\n");
- exit(1);
- }
- alarm(1);
- while(1){
- write(p2f[1], "a", 1);
- }
- close(p2f[0]);
- close(pfts[1]);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement