18 {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""},
19 {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""},
20 {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""},
21 {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, ""},
25 {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, ""},
29 {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}
33 /* semaphore operations */
35 int initsem(key_t key, int value) /* create a semaphore */
40 if ((semid = semget(key, 1, SEMPERM|IPC_CREAT|IPC_EXCL)) == -1) {
41 if (errno == EEXIST) {
42 printf("semget key %d already exist\n", key);
43 semid = semget(key, 1, 0);
46 status = semctl(semid, 0, SETVAL, value);
49 if (semid == -1 || status == -1) {
50 printf("%d:\n", getpid());
51 perror("initsem() failed");
57 //int getsem(key_t key, int setval) /* create a semaphore */
58 int getsem(key_t key) /* create a semaphore */
63 semid = semget(key, 1, 0);
65 if (semid == -1 || status == -1) {
66 printf("%d:\n", getpid());
67 perror("initsem() failed");
73 int waitsem(int semid) /* wait on a semaphore */
82 p_buf.sem_flg = SEM_UNDO;
84 if (semop(semid, &p_buf, 1) == -1) {
85 printf("%d:", getpid());
86 perror("waitsem() failed");
92 int postsem(int semid) /* post to a semaphore */
103 v_buf.sem_flg = SEM_UNDO;
105 if (semop(semid, &v_buf, 1) == -1) {
106 printf("%d:", getpid());
107 perror("postsem() failed");
113 void destsem(int semid) /* destroy a semaphore */
115 semctl(semid, 0, IPC_RMID, 0);
118 int dest_and_init_sem (key_t key, int value, char * name)
122 semid = getsem (key);
125 semid = initsem (key, value);
126 printf ("%s semid %d for key %d value %d \n", name, semid, key, value);
129 printf ("semid == 0\n");
133 for (i=0; i<MAX_SEM; i++) {
134 if (semname[i].semid == 0) {
135 semname[i].semid = semid;
136 strcpy(semname[i].name, name);
142 printf ("semname full\n");