21 {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""},
22 {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""},
23 {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""},
24 {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""},
26 {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""},
27 {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""},
28 {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""},
29 {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""},
30 {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""},
32 {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}
36 /* semaphore operations */
38 int initsem(key_t key, int value) /* create a semaphore */
43 if ((semid = semget(key, 1, SEMPERM|IPC_CREAT|IPC_EXCL)) == -1) {
44 if (errno == EEXIST) {
45 printf("semget key %d already exist\n", key);
46 semid = semget(key, 1, 0);
49 status = semctl(semid, 0, SETVAL, value);
52 if (semid == -1 || status == -1) {
53 printf("%d:\n", getpid());
54 perror("initsem() failed");
60 //int getsem(key_t key, int setval) /* create a semaphore */
61 int getsem(key_t key) /* create a semaphore */
66 semid = semget(key, 1, 0);
68 if (semid == -1 || status == -1) {
69 printf("%d:\n", getpid());
70 perror("initsem() failed");
76 int waitsem(int semid) /* wait on a semaphore */
85 p_buf.sem_flg = SEM_UNDO;
87 if (semop(semid, &p_buf, 1) == -1) {
88 printf("%d:", getpid());
89 perror("waitsem() failed");
95 int postsem(int semid) /* post to a semaphore */
106 v_buf.sem_flg = SEM_UNDO;
108 if (semop(semid, &v_buf, 1) == -1) {
109 printf("%d:", getpid());
110 perror("postsem() failed");
116 void destsem(int semid) /* destroy a semaphore */
118 semctl(semid, 0, IPC_RMID, 0);
121 int dest_and_init_sem (key_t key, int value, char * name)
125 semid = getsem (key);
128 semid = initsem (key, value);
129 printf ("%s semid %d for key %d value %d \n", name, semid, key, value);
132 printf ("semid == 0\n");
136 for (i=0; i<MAX_SEM; i++) {
137 if (semname[i].semid == 0) {
138 semname[i].semid = semid;
139 strcpy(semname[i].name, name);
145 printf ("semname full\n");