]>
cygwin.com Git - cygwin-apps/cygutils.git/blob - src/ipc/semtool.c
1 /*****************************************************************************
2 Excerpt from "Linux Programmer's Guide - Chapter 6"
3 (C)opyright 1994-1995, Scott Burkett
4 *****************************************************************************
6 *****************************************************************************
7 A command line tool for tinkering with SysV style Semaphore Sets
9 *****************************************************************************/
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License
13 * as published by the Free Software Foundation; either version 2
14 * of the License, or (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
25 * See the COPYING file for license information.
41 /* arg for semctl system calls. */
43 int val
; /* value for SETVAL */
44 struct semid_ds
*buf
; /* buffer for IPC_STAT & IPC_SET */
45 ushort
*array
; /* array for GETALL & SETALL */
46 struct seminfo
*__buf
; /* buffer for IPC_INFO */
50 #define SEM_RESOURCE_MAX 1 /* Initial value of all semaphores */
52 void opensem(int *sid
, key_t key
);
53 void createsem(int *sid
, key_t key
, int members
);
54 void locksem(int sid
, int member
);
55 void unlocksem(int sid
, int member
);
56 void removesem(int sid
);
57 unsigned short get_member_count(int sid
);
58 int getval(int sid
, int member
);
59 void dispval(int sid
, int member
);
60 void changemode(int sid
, char *mode
);
63 int main(int argc
, char *argv
[])
71 /* Create unique key via call to ftok() */
74 switch(tolower(argv
[1][0]))
76 case 'c': if(argc
!= 3)
78 createsem(&semset_id
, key
, atoi(argv
[2]));
80 case 'l': if(argc
!= 3)
82 opensem(&semset_id
, key
);
83 locksem(semset_id
, atoi(argv
[2]));
85 case 'u': if(argc
!= 3)
87 opensem(&semset_id
, key
);
88 unlocksem(semset_id
, atoi(argv
[2]));
90 case 'd': opensem(&semset_id
, key
);
93 case 'm': opensem(&semset_id
, key
);
94 changemode(semset_id
, argv
[2]);
103 void opensem(int *sid
, key_t key
)
105 /* Open the semaphore set - do not create! */
107 if((*sid
= semget(key
, 0, 0666)) == -1)
109 printf("Semaphore set does not exist!\n");
115 void createsem(int *sid
, key_t key
, int members
)
120 if(members
> SEMMSL
) {
121 printf("Sorry, max number of semaphores in a set is %d\n",
126 printf("Attempting to create new semaphore set with %d members\n",
129 if((*sid
= semget(key
, members
, IPC_CREAT
|IPC_EXCL
|0666))
132 fprintf(stderr
, "Semaphore set already exists!\n");
136 semopts
.val
= SEM_RESOURCE_MAX
;
138 /* Initialize all members (could be done with SETALL) */
139 for(cntr
=0; cntr
<members
; cntr
++)
140 semctl(*sid
, cntr
, SETVAL
, semopts
);
143 void locksem(int sid
, int member
)
145 struct sembuf sem_lock
={ 0, -1, IPC_NOWAIT
};
147 if( member
<0 || member
>(get_member_count(sid
)-1))
149 fprintf(stderr
, "semaphore member %d out of range\n", member
);
153 /* Attempt to lock the semaphore set */
154 if(!getval(sid
, member
))
156 fprintf(stderr
, "Semaphore resources exhausted (no lock)!\n");
160 sem_lock
.sem_num
= member
;
162 if((semop(sid
, &sem_lock
, 1)) == -1)
164 fprintf(stderr
, "Lock failed\n");
168 printf("Semaphore resources decremented by one (locked)\n");
170 dispval(sid
, member
);
173 void unlocksem(int sid
, int member
)
175 struct sembuf sem_unlock
={ member
, 1, IPC_NOWAIT
};
178 if( member
<0 || member
>(get_member_count(sid
)-1))
180 fprintf(stderr
, "semaphore member %d out of range\n", member
);
184 /* Is the semaphore set locked? */
185 semval
= getval(sid
, member
);
186 if(semval
== SEM_RESOURCE_MAX
) {
187 fprintf(stderr
, "Semaphore not locked!\n");
191 sem_unlock
.sem_num
= member
;
193 /* Attempt to lock the semaphore set */
194 if((semop(sid
, &sem_unlock
, 1)) == -1)
196 fprintf(stderr
, "Unlock failed\n");
200 printf("Semaphore resources incremented by one (unlocked)\n");
202 dispval(sid
, member
);
205 void removesem(int sid
)
210 semctl(sid
, 0, IPC_RMID
, semopts
);
211 printf("Semaphore removed\n");
214 unsigned short get_member_count(int sid
)
217 struct semid_ds mysemds
;
219 semopts
.buf
= &mysemds
;
221 /* Return number of members in the semaphore set */
222 return(semopts
.buf
->sem_nsems
);
225 int getval(int sid
, int member
)
231 semval
= semctl(sid
, member
, GETVAL
, semopts
);
235 void changemode(int sid
, char *mode
)
239 struct semid_ds mysemds
;
241 /* Get current values for internal data structure */
242 semopts
.buf
= &mysemds
;
244 rc
= semctl(sid
, 0, IPC_STAT
, semopts
);
251 printf("Old permissions were %o\n", semopts
.buf
->sem_perm
.mode
);
253 /* Change the permissions on the semaphore */
254 sscanf(mode
, "%ho", &semopts
.buf
->sem_perm
.mode
);
256 /* Update the internal data structure */
257 semctl(sid
, 0, IPC_SET
, semopts
);
259 printf("Updated...\n");
263 void dispval(int sid
, int member
)
269 semval
= semctl(sid
, member
, GETVAL
, semopts
);
270 printf("semval for member %d is %d\n", member
, semval
);
275 fprintf(stderr
, "semtool - A utility for tinkering with semaphores\n");
276 fprintf(stderr
, "\nUSAGE: semtool (c)reate <semcount>\n");
277 fprintf(stderr
, " (l)ock <sem #>\n");
278 fprintf(stderr
, " (u)nlock <sem #>\n");
279 fprintf(stderr
, " (d)elete\n");
280 fprintf(stderr
, " (m)ode <mode>\n");
This page took 0.050494 seconds and 5 git commands to generate.