Advertisement
Guest User

main.c

a guest
Feb 9th, 2014
218
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.86 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <sys/shm.h>
  4. #include <sys/ipc.h>
  5. #include <sys/sem.h>
  6.  
  7. int alokujSem(key_t klucz, int number,int flagi)
  8. {
  9. int semID;
  10. if((semID=semget(klucz,number, flagi))==-1)
  11. {
  12. perror("Blad semget(alokujSem) ");
  13. exit(-1);
  14. }
  15. return semID;
  16. }
  17. int zwolnijSem(int semID, int number)
  18. {
  19. return semctl(semID, number, IPC_RMID,NULL);
  20. }
  21.  
  22. void inicjalizujSem(int semID,int number,int val)
  23. {
  24. if(semctl(semID, number, SETVAL, val)==-1)
  25. {
  26. perror("Blad semctl (inicjalizujSem) ");
  27. exit(-2);
  28. }
  29. }
  30.  
  31. int main(int argc, char * argv[])
  32. {
  33. key_t kluczs,kluczm; //klucz do semafora i pamieci dzielonej
  34. int semID; //identyfikator zestawu semaforow
  35. int N=6; //liczba semaforo -widelec+jadalnia
  36. int i;
  37. int shmID; //identyfikatro pamieci dzielonej
  38. char bufor[3];
  39. int *widelec; //tablica widelcow -pamiec dzielona
  40. if((kluczs=ftok(".",123))==-1)
  41. {
  42. printf("Blad ftok (main)\n");
  43. exit(-3);
  44. }
  45. //tworzenie zestawu 6 semaforow -widelec + jadalnia
  46. semID = semget(kluczs,N,0600|IPC_CREAT|IPC_EXCL);
  47. for(i=0;i<5;i++)
  48. inicjalizujSem(semID, i,1); //inicjalizuj semafor widelcow
  49. inicjalizujSem(semID,5,4); //inicjalizuje semafor jadalni
  50. kluczm=ftok(".",456); //klucz do pamieci dzielonej
  51. //tworzenie pamieci dzielonej
  52. if((shmID=shmget(kluczm,5*sizeof(int),IPC_CREAT|0600|IPC_EXCL))==-1)
  53. {
  54. printf("Blad shm\n");
  55. exit(-4);
  56. }
  57. fflush(stdout);
  58. widelec=(int*)shmat(shmID,NULL,0); //przydzielenie pamieci dzielonej
  59. for(i=0;i<5;i++)
  60. switch(fork())
  61. {
  62. case -1:
  63. perror("Blad fork (glowny)");
  64. exit(2);
  65. case 0:
  66. sprintf(bufor,"%d",i); //przekazanie numeru
  67. execl("./filozof","filozof",bufor,NULL);
  68. }
  69. for(i=0;i<5;i++)
  70. wait(NULL);//czekanie na zakonczenie procesow filozofow
  71. zwolnijSem(semID,N); //zwolnienie zestawu semaforow
  72. shmctl(semID,IPC_RMID,NULL); //zwolnienie pamieci dzielonej
  73. printf("Koniec\n");
  74.  
  75. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement