surpassgood 发表于 2013-07-21 16:59

进程间通信的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]
查看完整版本: 进程间通信的system v信号量