]>
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. */
50 int val
; /* value for SETVAL */
51 struct semid_ds
*buf
; /* buffer for IPC_STAT & IPC_SET */
52 ushort
*array
; /* array for GETALL & SETALL */
53 struct seminfo
*__buf
; /* buffer for IPC_INFO */
57 #define SEM_RESOURCE_MAX 1 /* Initial value of all semaphores */
59 void opensem(int *sid
, key_t key
);
60 void createsem(int *sid
, key_t key
, int members
);
61 void locksem(int sid
, int member
);
62 void unlocksem(int sid
, int member
);
63 void removesem(int sid
);
64 unsigned short get_member_count(int sid
);
65 int getval(int sid
, int member
);
66 void dispval(int sid
, int member
);
67 void changemode(int sid
, char *mode
);
70 int main(int argc
, char *argv
[])
78 /* Create unique key via call to ftok() */
81 switch(tolower(argv
[1][0]))
83 case 'c': if(argc
!= 3)
85 createsem(&semset_id
, key
, atoi(argv
[2]));
87 case 'l': if(argc
!= 3)
89 opensem(&semset_id
, key
);
90 locksem(semset_id
, atoi(argv
[2]));
92 case 'u': if(argc
!= 3)
94 opensem(&semset_id
, key
);
95 unlocksem(semset_id
, atoi(argv
[2]));
97 case 'd': opensem(&semset_id
, key
);
100 case 'm': opensem(&semset_id
, key
);
101 changemode(semset_id
, argv
[2]);
110 void opensem(int *sid
, key_t key
)
112 /* Open the semaphore set - do not create! */
114 if((*sid
= semget(key
, 0, 0666)) == -1)
116 printf("Semaphore set does not exist!\n");
122 void createsem(int *sid
, key_t key
, int members
)
127 if(members
> SEMMSL
) {
128 printf("Sorry, max number of semaphores in a set is %d\n",
133 printf("Attempting to create new semaphore set with %d members\n",
136 if((*sid
= semget(key
, members
, IPC_CREAT
|IPC_EXCL
|0666))
139 fprintf(stderr
, "Semaphore set already exists!\n");
143 semopts
.val
= SEM_RESOURCE_MAX
;
145 /* Initialize all members (could be done with SETALL) */
146 for(cntr
=0; cntr
<members
; cntr
++)
147 semctl(*sid
, cntr
, SETVAL
, semopts
);
150 void locksem(int sid
, int member
)
152 struct sembuf sem_lock
={ 0, -1, IPC_NOWAIT
};
154 if( member
<0 || member
>(get_member_count(sid
)-1))
156 fprintf(stderr
, "semaphore member %d out of range\n", member
);
160 /* Attempt to lock the semaphore set */
161 if(!getval(sid
, member
))
163 fprintf(stderr
, "Semaphore resources exhausted (no lock)!\n");
167 sem_lock
.sem_num
= member
;
169 if((semop(sid
, &sem_lock
, 1)) == -1)
171 fprintf(stderr
, "Lock failed\n");
175 printf("Semaphore resources decremented by one (locked)\n");
177 dispval(sid
, member
);
180 void unlocksem(int sid
, int member
)
182 struct sembuf sem_unlock
={ member
, 1, IPC_NOWAIT
};
185 if( member
<0 || member
>(get_member_count(sid
)-1))
187 fprintf(stderr
, "semaphore member %d out of range\n", member
);
191 /* Is the semaphore set locked? */
192 semval
= getval(sid
, member
);
193 if(semval
== SEM_RESOURCE_MAX
) {
194 fprintf(stderr
, "Semaphore not locked!\n");
198 sem_unlock
.sem_num
= member
;
200 /* Attempt to lock the semaphore set */
201 if((semop(sid
, &sem_unlock
, 1)) == -1)
203 fprintf(stderr
, "Unlock failed\n");
207 printf("Semaphore resources incremented by one (unlocked)\n");
209 dispval(sid
, member
);
212 void removesem(int sid
)
217 semctl(sid
, 0, IPC_RMID
, semopts
);
218 printf("Semaphore removed\n");
221 unsigned short get_member_count(int sid
)
224 struct semid_ds mysemds
;
226 semopts
.buf
= &mysemds
;
228 /* Return number of members in the semaphore set */
229 return(semopts
.buf
->sem_nsems
);
232 int getval(int sid
, int member
)
238 semval
= semctl(sid
, member
, GETVAL
, semopts
);
242 void changemode(int sid
, char *mode
)
246 struct semid_ds mysemds
;
248 /* Get current values for internal data structure */
249 semopts
.buf
= &mysemds
;
251 rc
= semctl(sid
, 0, IPC_STAT
, semopts
);
258 printf("Old permissions were %o\n", semopts
.buf
->sem_perm
.mode
);
260 /* Change the permissions on the semaphore */
261 sscanf(mode
, "%ho", &semopts
.buf
->sem_perm
.mode
);
263 /* Update the internal data structure */
264 semctl(sid
, 0, IPC_SET
, semopts
);
266 printf("Updated...\n");
270 void dispval(int sid
, int member
)
276 semval
= semctl(sid
, member
, GETVAL
, semopts
);
277 printf("semval for member %d is %d\n", member
, semval
);
282 fprintf(stderr
, "semtool - A utility for tinkering with semaphores\n");
283 fprintf(stderr
, "\nUSAGE: semtool (c)reate <semcount>\n");
284 fprintf(stderr
, " (l)ock <sem #>\n");
285 fprintf(stderr
, " (u)nlock <sem #>\n");
286 fprintf(stderr
, " (d)elete\n");
287 fprintf(stderr
, " (m)ode <mode>\n");
This page took 0.057118 seconds and 5 git commands to generate.