- 论坛徽章:
- 0
|
- (1)semcreate.c [color=Red]/创建一个信号量集/[/color]
- #include<stdlib.h>
- #include<stdio.h>
- #include<sys/sem.h>
- #include<unistd.h>
- #include<sys/types.h>
- int main(int argc,char **argv)
- {
- int c,oflag,semid,nsems;
- oflag=0644|IPC_CREAT;
- while((c=getopt(argc,argv,"e"))!=-1)
- {
- switch(c)
- {
- case 'e':
- oflag|=IPC_EXCL;
- printf("create faile :exist\n");
- break;
- }
- }
- if(optind!=argc-2)
- printf("usage:semcreate[-e]<pathname><nsems>\n");
- nsems=atoi(argv[optind+1]);
- printf("nsems=%d\n",nsems);
- semid=semget(ftok(argv[optind],0),nsems,oflag);
- printf("semid=%d\n",semid);
- exit(0);
- }
- (2)semrmid.c [color=Red]/*删除一个信号量集*/[/color]
- #include<stdio.h>
- #include<stdlib.h>
- #include<sys/sem.h>
- int main(int argc,char **argv)
- {
- int semid;
- if(argc!=2)
- printf("usage:semrid<pathname>");
- semid=semget(ftok(argv[1],0),0,0);
- semctl(semid,0,IPC_RMID);
- exit(0);
- }
- (3)semsetvalues.c /*设置信号量集用元素的值*/
- #include<stdio.h>
- #include<unistd.h>
- #include<sys/sem.h>
- #include<stdlib.h>
- union semun
- {
- int val;
- struct semid_ds *buf;
- unsigned short *array;
- };
- int main(int argc,char **argv)
- {
- int semid,nsems,i;
- struct semid_ds seminfo;
- unsigned short *ptr;
- union semun arg;
- if(argc<2)
- printf("usage:semsetvalues<pathname>[values...]\n");
- semid=semget(ftok(argv[1],0),0,0);
- printf("semid=%d\n",semid);
- arg.buf=&seminfo;
- semctl(semid,0,IPC_STAT,arg);
- nsems=arg.buf->sem_nsems;
-
- if (argc!=nsems+2)
- printf("%d semaphores in set,%d values specified",nsems,argc-2);
- ptr=calloc(nsems,sizeof(unsigned short));
- arg.array=ptr;
- for(i=0;i<nsems;i++)
- ptr[i]=atoi(argv[i+2]);
- semctl(semid,0,SETALL,arg);
- exit(0);
- }
- (4)semsetvalues.c
- #include<stdio.h>
- #include<stdlib.h>
- #include<sys/sem.h>
- union semun
- {
- int val;
- struct semid_ds *buf;
- unsigned short *array;
- };
- int main(int argc,char **argv)
- {
- int semid,nsems,i;
- struct semid_ds seminfo;
- unsigned short *ptr;
- union semun arg;
- if(argc!=2)
- printf("usage:semgetvalues<pathname>\n");
- semid=semget(ftok(argv[1],0),0,0);
- printf("semid=%d\n",semid);
- arg.buf=&seminfo;
- semctl(semid,0,IPC_STAT,arg);
- nsems=arg.buf->sem_nsems;
- ptr=calloc(nsems,sizeof(unsigned short));
- arg.array=ptr;
- semctl(semid,0,GETALL,arg);
- for(i=0;i<nsems;i++)
- printf("semval[%d]=%d\n",i,ptr[i]);
- exit(0);
- }
- (5)
- semops.c
- #include<stdlib.h>
- #include<stdio.h>
- #include<sys/sem.h>
- #include<unistd.h>
- int main(int argc,char **argv)
- {
- int c,i,flag,semid,nops;
- struct sembuf *ptr;
- flag=0;
- while((c=getopt(argc,argv,"nu"))!=-1)
- {
- switch(c)
- {
- case 'n':
- flag|=IPC_NOWAIT;
- break;
- case 'u':
- flag|=SEM_UNDO;
- break;
- }
- }
- if(argc-optind<2)
- printf("usage:semops[-n][-u]<pathname>operation...");
- semid=semget(ftok(argv[optind],0),0,0);
- optind++;
- nops=argc-optind;
- ptr=calloc(nops,sizeof(struct sembuf));
- for(i=0;i<nops;i++)
- {
- ptr[i].sem_num=i;
- ptr[i].sem_op=atoi(argv[optind+1]);
- ptr[i].sem_flg=flag;
- }
- semop(semid,ptr,nops);
- exit(0);
- }
复制代码 运行:
ermao@lost-desktop:~/ermao$ gcc -o semcreate semcreate.c
ermao@lost-desktop:~/ermao$ gcc -o semrmid semrmid.c
ermao@lost-desktop:~/ermao$ gcc -o semsetvalue semsetvalue.c
ermao@lost-desktop:~/ermao$ gcc -o semgetvalues semgetvalues.c
ermao@lost-desktop:~/ermao$ gcc -o semops semops.c
ermao@lost-desktop:~/ermao$ touch /tmp/ermao
ermao@lost-desktop:~/ermao$ ./semcreate /tmp/ermao 3
nsems=3
semid=32769
ermao@lost-desktop:~/ermao$ ./semsetvalue /tmp/ermao 1 2 3
nsems=134514384
ermao@lost-desktop:~/ermao$ ./semgetvalues /tmp/ermao
nsems=134514315
semval[0]=1
semval[1]=2
semval[2]=3
ermao@lost-desktop:~/ermao$ ./semops -n /tmp/ermao -1 -2 -4
./semops: invalid option -- '1'问什么为负数的时候invalid的,求解释?
./semops: invalid option -- '2'
./semops: invalid option -- '4'
usage:semops[-n][-u]<pathname>operation...
|
|