Advertisement
Guest User

Untitled

a guest
May 22nd, 2019
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.02 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <unistd.h>
  4. #include <signal.h>
  5. #include <stdlib.h>
  6.  
  7.  
  8. unsigned long total = 0, curent = 0, stp[5], poz = -1, secunde = 0;
  9. pid_t fiu;
  10. int p2f[2];
  11. int pfts[2];
  12.  
  13. void calculeazaStatistica(int sig){
  14. printf("Proces fiu: Am primit SIGUSR1\n");
  15. poz++;
  16. stp[poz] = curent;
  17. total+=curent;
  18. curent=0;
  19. }
  20.  
  21. void terminaFiu(int sig){
  22. int i;
  23.  
  24. write(pfts[1], &total, sizeof(unsigned long));
  25. for (i = 0; i < 5; i++){
  26. write(pfts[1], &stp[i], sizeof(unsigned long));
  27. }
  28. close(pfts[1]);
  29. exit(0);
  30. }
  31.  
  32. void alarma(int sig){
  33. int i = 0;
  34.  
  35. if (secunde == 5){
  36. kill(fiu, SIGUSR2);
  37. read(pfts[0], &total, sizeof(unsigned long));
  38. printf("Fiul s-a terminat. Statistica:\n");
  39. printf("Numar total de caractere trimis: %ld\n", total);
  40. while (read(pfts[0], &stp[i], sizeof(unsigned long)) > 0)
  41. {
  42. printf("Numar de caractere la secunda %d: %ld\n",i+1, stp[i]);
  43. i++;
  44. }
  45. close(pfts[0]);
  46. exit(0);
  47. } else {
  48. kill(fiu, SIGUSR1);
  49. secunde++;
  50. alarm(1);
  51. }
  52. }
  53.  
  54. int main(void){
  55. char buf;
  56. int i;
  57.  
  58. if (pipe(p2f) < 0){
  59. perror("Eroare la pipe");
  60. exit(1);
  61. }
  62. if (pipe(pfts) < 0){
  63. perror("Eroare la pipe");
  64. exit(1);
  65. }
  66. if ((fiu = fork()) < 0)
  67. {
  68. perror("Eroare la fork\n");
  69. exit(2);
  70. }
  71.  
  72. if (fiu == 0)
  73. {
  74. close(p2f[1]);
  75. close(pfts[0]);
  76. if (signal(SIGUSR1, calculeazaStatistica) == SIG_ERR)
  77. {
  78. perror("Eroare in procesul fiu, la primul apel signal\n");
  79. exit(1);
  80. }
  81.  
  82. if (signal(SIGUSR2, terminaFiu) == SIG_ERR)
  83. {
  84. perror("Eroare in procesul fiu, la al doilea apelul signal\n");
  85. exit(1);
  86. }
  87. while(read(p2f[0], &buf, 1) > 0)
  88. {
  89. curent++;
  90. }
  91. close(p2f[0]);
  92. close(pfts[0]);
  93. exit(0);
  94. } else
  95. {
  96. close(p2f[0]);
  97. close(pfts[1]);
  98. if (signal(SIGALRM, alarma) == SIG_ERR){
  99. perror("Eroare in procesul parinte, la apelul signal\n");
  100. exit(1);
  101. }
  102. alarm(1);
  103. while(1){
  104. write(p2f[1], "a", 1);
  105. }
  106. close(p2f[0]);
  107. close(pfts[1]);
  108. }
  109. return 0;
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement