- 论坛徽章:
- 0
|
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <fcntl.h>
- #include <errno.h>
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/sem.h>
- /*-----------------------------------*
- * Delete semaphore key *
- *-----------------------------------*/
- int sem_del(key)
- int key;
- {
- int semid, sysreturn;
- char ret1[255];
- char ret2[255];
- char msg[255];
- extern int errno;
- if((semid=semget(key,1,IPC_EXCL)) != -1)
- {
- sysreturn=semctl(semid, 0, IPC_RMID); /* delete semaphore */
- if(sysreturn != 0)
- {
- return(8);
- }
- return(0);
- }
- else
- {
- return(10);
- }
- }
- /*-----------------------------------*
- * Set new (or reset) process counts *
- *-----------------------------------*/
- int sem_set(key,cnt)
- int key,cnt;
- {
- int semid, sysreturn, ret;
- struct sembuf sb[1];
- char ret1[255];
- char ret2[255];
- if((semid=semget(key,1,IPC_EXCL)) == -1)
- {
- semid=semget(key,1,IPC_CREAT|0666);
- semctl(semid,0,SETVAL,cnt); /* set semaphore number */
- return(0);
- }
- else
- {
- return(1);
- }
- }
- /*-----------------------------------*
- * Check current semaphore number *
- *-----------------------------------*/
- int sem_checkval(key)
- int key;
- {
- int semid;
- struct sembuf sb[1];
- int ret;
- if((semid=semget(key,1,IPC_EXCL)) == -1)
- {
- return(1);
- }
- sb[0].sem_num=0;
- sb[0].sem_flg=0;
- ret=semctl(semid,0,GETVAL,1);
- if(ret != -1)
- {
- printf("%d %d\n",semid,ret);
- return(0);
- }
- else
- {
- return(8);
- }
- }
- /*-------------------------------------*
- * Lock and unlock semaphore operation *
- *-------------------------------------*/
- int sem_landu(cmd,key,opt)
- char cmd[255];
- char opt[255];
- int key;
- {
- int semid, ret;
- struct sembuf sb[1];
- char emesg[255];
- extern int errno;
- if((semid=semget(key,1,IPC_EXCL)) == -1)
- {
- return(1); /* Invalid semaphore key number */
- }
- sb[0].sem_num=0;
- if(strcmp(cmd,"-l") == 0 && strcmp(opt,"NOWAIT") == 0)
- {
- sb[0].sem_flg=IPC_NOWAIT;
- }
- else if(strlen(opt) == 0)
- {
- sb[0].sem_flg=0;
- }
- else
- {
- exit(9);
- }
- if(strcmp(cmd,"-u") == 0)
- {
- sb[0].sem_op = 1; /* Unlock semaphore */
- }
- else /* if not "-u", it is "-l" */
- {
- sb[0].sem_op = -1; /* lock semaphore */
- }
- ret=semop(semid,sb,1); /* semaphore operation */
- if(ret == -1)
- {
- ret=errno;
- if ( ret == EAGAIN )
- {
- return(3); /* Can't do lock action now */
- }
- else
- {
- return(errno); /* Error */
- }
- }
- else if(ret == 0)
- {
- return(0); /* Success */
- }
- else
- {
- return(8); /* System Error */
- }
- }
- /*----------------------*
- * Start main *
- *----------------------*/
- int main(argc,argv)
- char *argv[];
- {
- int key,cnt,ret;
- char cmd[255];
- char opt[255];
- strcpy(cmd,argv[1]);
- key=atoi(argv[2]);
- cnt=atoi(argv[3]);
- if(strcmp(cmd,"-s") == 0)
- {
- ret=sem_del(key);
- if(ret != 0 && ret != 10)
- {
- exit(ret);
- }
- ret=sem_set(key,cnt);
- }
- else if (strcmp(cmd,"-l") == 0 || strcmp(cmd,"-u") == 0)
- {
- strcpy(opt,argv[3]);
- ret=sem_landu(cmd,key,opt);
- }
- else if (strcmp(cmd,"-c") ==0)
- {
- ret=sem_checkval(key);
- }
- else if (strcmp(cmd,"-d") ==0)
- {
- ret=sem_del(key);
- if (ret == 10)
- {
- ret=1;
- }
- }
- else
- {
- ret=9; /* Unsupported command(argv1) */
- }
- exit(ret);
- }
复制代码 |
|