进程间通信的system v信号量
(1)semcreate.c/创建一个信号量集/
#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);
printf("nsems=%d\n",nsems);
semid=semget(ftok(argv,0),nsems,oflag);
printf("semid=%d\n",semid);
exit(0);
}
(2)semrmid.c/*删除一个信号量集*/
#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,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>\n");
semid=semget(ftok(argv,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=atoi(argv);
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;
structsemid_ds seminfo;
unsigned short *ptr;
union semun arg;
if(argc!=2)
printf("usage:semgetvalues<pathname>\n");
semid=semget(ftok(argv,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);
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,0),0,0);
optind++;
nops=argc-optind;
ptr=calloc(nops,sizeof(struct sembuf));
for(i=0;i<nops;i++)
{
ptr.sem_num=i;
ptr.sem_op=atoi(argv);
ptr.sem_flg=flag;
}
semop(semid,ptr,nops);
exit(0);
}
运行:
ermao@lost-desktop:~/ermao$ gcc -o semcreate semcreate.c
ermao@lost-desktop:~/ermao$ gcc -o semrmidsemrmid.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 semopssemops.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=1
semval=2
semval=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...
页:
[1]