]>
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 /* cygserver doesn't define this constant where we
42 can get it, so just use the default configuration
48 /* arg for semctl system calls. */
51 int val
; /* value for SETVAL */
52 struct semid_ds
*buf
; /* buffer for IPC_STAT & IPC_SET */
53 ushort
*array
; /* array for GETALL & SETALL */
54 struct seminfo
*__buf
; /* buffer for IPC_INFO */
58 #define SEM_RESOURCE_MAX 1 /* Initial value of all semaphores */
60 void opensem (int *sid
, key_t key
);
61 void createsem (int *sid
, key_t key
, int members
);
62 void locksem (int sid
, int member
);
63 void unlocksem (int sid
, int member
);
64 void removesem (int sid
);
65 unsigned short get_member_count (int sid
);
66 int getval (int sid
, int member
);
67 void dispval (int sid
, int member
);
68 void changemode (int sid
, char *mode
);
72 main (int argc
, char *argv
[])
80 /* Create unique key via call to ftok() */
81 key
= ftok (".", 's');
83 switch (tolower (argv
[1][0]))
88 createsem (&semset_id
, key
, atoi (argv
[2]));
93 opensem (&semset_id
, key
);
94 locksem (semset_id
, atoi (argv
[2]));
99 opensem (&semset_id
, key
);
100 unlocksem (semset_id
, atoi (argv
[2]));
103 opensem (&semset_id
, key
);
104 removesem (semset_id
);
107 opensem (&semset_id
, key
);
108 changemode (semset_id
, argv
[2]);
119 opensem (int *sid
, key_t key
)
121 /* Open the semaphore set - do not create! */
123 if ((*sid
= semget (key
, 0, 0666)) == -1)
125 printf ("Semaphore set does not exist!\n");
132 createsem (int *sid
, key_t key
, int members
)
137 if (members
> SEMMSL
)
139 printf ("Sorry, max number of semaphores in a set is %d\n", SEMMSL
);
143 printf ("Attempting to create new semaphore set with %d members\n",
146 if ((*sid
= semget (key
, members
, IPC_CREAT
| IPC_EXCL
| 0666)) == -1)
148 fprintf (stderr
, "Semaphore set already exists!\n");
152 semopts
.val
= SEM_RESOURCE_MAX
;
154 /* Initialize all members (could be done with SETALL) */
155 for (cntr
= 0; cntr
< members
; cntr
++)
156 semctl (*sid
, cntr
, SETVAL
, semopts
);
160 locksem (int sid
, int member
)
162 struct sembuf sem_lock
= { 0, -1, IPC_NOWAIT
};
164 if (member
< 0 || member
> (get_member_count (sid
) - 1))
166 fprintf (stderr
, "semaphore member %d out of range\n", member
);
170 /* Attempt to lock the semaphore set */
171 if (!getval (sid
, member
))
173 fprintf (stderr
, "Semaphore resources exhausted (no lock)!\n");
177 sem_lock
.sem_num
= member
;
179 if ((semop (sid
, &sem_lock
, 1)) == -1)
181 fprintf (stderr
, "Lock failed\n");
185 printf ("Semaphore resources decremented by one (locked)\n");
187 dispval (sid
, member
);
191 unlocksem (int sid
, int member
)
193 struct sembuf sem_unlock
= { member
, 1, IPC_NOWAIT
};
196 if (member
< 0 || member
> (get_member_count (sid
) - 1))
198 fprintf (stderr
, "semaphore member %d out of range\n", member
);
202 /* Is the semaphore set locked? */
203 semval
= getval (sid
, member
);
204 if (semval
== SEM_RESOURCE_MAX
)
206 fprintf (stderr
, "Semaphore not locked!\n");
210 sem_unlock
.sem_num
= member
;
212 /* Attempt to lock the semaphore set */
213 if ((semop (sid
, &sem_unlock
, 1)) == -1)
215 fprintf (stderr
, "Unlock failed\n");
219 printf ("Semaphore resources incremented by one (unlocked)\n");
221 dispval (sid
, member
);
230 semctl (sid
, 0, IPC_RMID
, semopts
);
231 printf ("Semaphore removed\n");
235 get_member_count (int sid
)
238 struct semid_ds mysemds
;
240 semopts
.buf
= &mysemds
;
242 /* Return number of members in the semaphore set */
243 return (semopts
.buf
->sem_nsems
);
247 getval (int sid
, int member
)
253 semval
= semctl (sid
, member
, GETVAL
, semopts
);
258 changemode (int sid
, char *mode
)
262 struct semid_ds mysemds
;
264 /* Get current values for internal data structure */
265 semopts
.buf
= &mysemds
;
267 rc
= semctl (sid
, 0, IPC_STAT
, semopts
);
275 printf ("Old permissions were %o\n", semopts
.buf
->sem_perm
.mode
);
277 /* Change the permissions on the semaphore */
278 sscanf (mode
, "%ho", &semopts
.buf
->sem_perm
.mode
);
280 /* Update the internal data structure */
281 semctl (sid
, 0, IPC_SET
, semopts
);
283 printf ("Updated...\n");
288 dispval (int sid
, int member
)
294 semval
= semctl (sid
, member
, GETVAL
, semopts
);
295 printf ("semval for member %d is %d\n", member
, semval
);
301 fprintf (stderr
, "semtool - A utility for tinkering with semaphores\n");
302 fprintf (stderr
, "\nUSAGE: semtool (c)reate <semcount>\n");
303 fprintf (stderr
, " (l)ock <sem #>\n");
304 fprintf (stderr
, " (u)nlock <sem #>\n");
305 fprintf (stderr
, " (d)elete\n");
306 fprintf (stderr
, " (m)ode <mode>\n");
This page took 0.049664 seconds and 5 git commands to generate.