Advertisement
Guest User

Untitled

a guest
Jun 28th, 2017
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.59 KB | None | 0 0
  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <sys/wait.h>
  5. #include "sem.h"
  6.  
  7. #define N_NIM 5
  8.  
  9. void nim( int i ) ;
  10.  
  11. int sem1;
  12. int sem2;
  13. int *counter;
  14.  
  15. int nfilhos;
  16.  
  17.  
  18. void barreira() {
  19. int i;
  20.  
  21. P(sem1);
  22. (*counter)++;
  23.  
  24. if ((*counter) < nfilhos) {
  25. V(sem1);
  26. P(sem2);
  27. P(sem1);
  28. }
  29. else {
  30. for (i=1; i<nfilhos; i++)
  31. V(sem2);
  32. (*counter) = 0;
  33. }
  34. V(sem1);
  35. }
  36.  
  37. int main(int argc, char **argv)
  38. {
  39.  
  40.  
  41. if( argc != 2 )
  42. { printf( "uso %s num_filhos\n", argv[0] );
  43. exit(1);
  44. }
  45.  
  46. nfilhos = atoi(argv[1]);
  47. sem1 = createSem (1);
  48. sem2 = createSem (0);
  49.  
  50. createSharedArea();
  51. attachArea();
  52.  
  53. int shm_id;
  54. int i;
  55. shm_id = createSharedArea(4); //4 pq é o tamanho de um inteiro
  56. counter = (int*)attachArea(shm_id);
  57.  
  58. for( i = 0; i < nfilhos; i++ )
  59. if( fork() == 0 )
  60. {
  61. nim(i);
  62. exit(0);
  63. }
  64.  
  65. for( i = 0; i < nfilhos; i++ ){
  66. wait(NULL);
  67. }
  68.  
  69. deleteSem(sem1);
  70. deleteSem(sem2);
  71. deleteSharedArea();
  72.  
  73. printf( "fim!\n" );
  74. return 0;
  75. }
  76.  
  77.  
  78. void nim(int i)
  79. {
  80. int pid = getpid();
  81. int n;
  82.  
  83. //o P tambem pode ser posto aqui
  84. for( n = 1; n <= N_NIM; n++ )
  85. {
  86. printf("Filho %d - <%d> Mensagem %d\n", i, pid, n );
  87. barreira();
  88. // para multi processadores podemos retirar a instrução seguinte
  89. usleep(100);
  90.  
  91. }
  92.  
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement