Advertisement
Guest User

Untitled

a guest
Mar 26th, 2019
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.03 KB | None | 0 0
  1. /*******************************************************************************************************
  2. Enunt prima problema:
  3.  
  4. a) Ce header trebuie inclus pentru a folosi functia access?
  5. b) Scrieti o secventa de cod ce verifica daca procesul apelant are drept de citire din fisierul "/etc/passwd"
  6.  
  7. NOTA: pastrati enuntul in acest comentariu si scrieti rezolvarea mai jos.
  8. *******************************************************************************************************/
  9.  
  10. a) unistd.h
  11.  
  12. b) const char * filename = "etc/passwd";
  13. result=access(filename, R_OK);
  14. if (result){
  15. return 1;
  16. }
  17.  
  18.  
  19.  
  20. /****************************************************************************************
  21. Enunt a doua problema:
  22.  
  23. Programul de mai jos contine trei erori sintactice (adica, detectabile la compilare), si ar trebui sa ofere
  24. urmatoarea functionalitate: Procesul principal creaza un fiu; Procesul fiu citeste doua numere
  25. le inmulteste si le returneaza folosind primitiva exit rezultatul inmultirii; Procesul parinte asteapta
  26. fiul sa termine si afiseaza rezultatul returnat;
  27.  
  28. Corectati in programul de mai jos cele trei erori introduse voluntar in asa fel incat sa obtineti un program corect.
  29. Dupa linia pe care ati facut o corectie, includeti si o explicatie ca si comentariu pentru a obtine punctajul integral.
  30.  
  31.  
  32. NOTA: pastrati enuntul in acest comentariu si scrieti rezolvarea mai jos.
  33. ****************************************************************************************/
  34.  
  35. #include <unistd.h>
  36. #include <stdio.h>
  37. #include <stdlib.h>
  38. #include <sys/types.h> //pt wait
  39. #include <sys/wait.h> //pt wait
  40.  
  41. int main(int argc, char* argv[])
  42. {
  43. int pid1;
  44.  
  45. pid1 = fork();
  46.  
  47. if(pid1 == -1)
  48. {
  49. printf("Eroare la fork!");
  50. return -1;
  51. }
  52.  
  53. if(pid1 != 0)
  54. {
  55. int status;
  56. waitpid(pid1, &status, 0);
  57. if(WIFEXITED(status))//era WFEXITED, lipsea un i
  58. {
  59. printf("Rezultatul este %d\n" , WEXITSTATUS(status) );//lipseau ghilimelele de la final
  60. }
  61. }
  62. else
  63. {
  64. int numar1, numar2, rezultat;
  65.  
  66. scanf("%d", &numar1);
  67. scanf("%d", &numar2);
  68.  
  69. rezultat = numar1 * numar2;
  70.  
  71. exit(rezultat);
  72. }
  73. }
  74.  
  75.  
  76. /*******************************************************************************************************
  77. Enunt a treia problema:
  78.  
  79. Sa se scrie un program C care va primi ca argument la linia de comanda o valoare numerica N,
  80. va citi N cuvinte de la tastatura si va calcula numarul de cuvinte din secventa citita
  81. ce au prima litera 'a' si ultima litera 'z', implementand urmatorii pasi:
  82. 1. procesul initial (P0) va crea un proces fiu P1 si ii va transmite toate cuvintele din secventa
  83. citita de la tastatura ce incep cu litera 'a'; cuvintele vor fi separate prin caracterul spatiu;
  84. transmiterea datelor se va realiza prin intermediul unui canal de comunicatie anonima;
  85. 2. procesul fiu P1 va crea la randul sau un nou proces fiu P2 si ii va transmite toate cuvintele
  86. din secventa primita de la procesul P0 care au ultima litera 'z'; cuvintele vor fi separate prin
  87. caracterul spatiu; transmiterea datelor se va realiza prin intermediul unui canal de comunicatie
  88. anonima;
  89. 3. procesul P2 va calcula numarul de cuvinte primite de la procesul P1 si ii va transmite
  90. procesului P1 valoarea calculata prin intermediul codului de retur (apel exit() sau instructiune
  91. return);
  92. 4. procesul P1 va transmite procesului P0 valoarea primita de la procesul P2 prin intermediul
  93. codului de retur (apel exit() sau instructiune return);
  94. 5. procesul P0 va afisa, la final, valoarea primita de la procesul P1.
  95.  
  96. OBSERVATIE: Utilizarea de fisiere obisnuite in locul canalelor de comunicatie anonima
  97. va fi penalizata cu trei puncte.
  98.  
  99. NOTA: pastrati enuntul in acest comentariu si scrieti rezolvarea mai jos.
  100. *******************************************************************************************************/
  101.  
  102. #include <unistd.h>
  103. #include <stdlib.h>
  104. #include <stdio.h>
  105. #include <sys/types.h>
  106. #include <sys/wait.h>
  107. #include <errno.h>
  108.  
  109. #define NMAX 100
  110.  
  111. int main (){
  112. /*declaratii*/
  113. int pid1, pid2;
  114. int pipe1[2], pipe2[2], pipe3[2];
  115. int n, i;
  116. char arr[NMAX];
  117.  
  118. /*creare pipes*/
  119. if (pipe(pipe1)==-1){
  120. perror ("Eroare la crearea pipe 1!");
  121. exit(1);
  122. }
  123. if (pipe(pipe2)==-1){
  124. perror("Eroare la crearea pipe2!");
  125. exit(1);
  126. }
  127. if (pipe(pipe3)==-1){
  128. perror("Eroare la crearea pipe 3!");
  129. exit(1);
  130. }
  131.  
  132. /*creare fork 1*/
  133. if ((pid1=fork())==-1){
  134. fprintf(stderr, "Eroare fork la fiul 1");
  135. exit(2);
  136. }
  137.  
  138. /*work*/
  139. if (pid1!=0 && pid2!=0){ /* sunt in master */
  140. printf("Introduceti n: ");
  141. scanf("%d", &n);
  142.  
  143. }
  144. else if (pid1==0){ /* sunt in fiu 1 */
  145. if ((pid2=fork())==-1){
  146. fprintf(stderr, "Eroare fork la fiul 2");
  147. exit(2);
  148. }
  149. return 1;
  150. }
  151.  
  152. else if (pid2==0){ /* sunt in fiu 2 */
  153. return 1;
  154. }
  155.  
  156. return 0;
  157. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement