进程间通信之信号量Semaphore

来源:互联网 发布:无线网卡怎么改mac地址 编辑:程序博客网 时间:2024/06/05 08:18

程序1:

#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>#include <unistd.h>#include<stdlib.h>#include<stdio.h>#define RESOURCE    4/*struct sem{unsigned short  semval;   // semaphore value unsigned short  semzcnt;  // # waiting for zero unsigned short  semncnt;  // # waiting for increase pid_t           sempid;   // ID of process that did last op }*/int main(void){int semid;union semun{int val;struct semid_ds*buf;unsigned short *array;struct seminfo*__buf;}arg;arg.val = RESOURCE;key_t key;if ((key = ftok(".",'c')) == -1)    {      perror("ftok error!\n");      exit(1);    }printf("key:%d\n",key);// int semget(key_t key, int nsems, int semflg); create sem setif ((semid = semget(key,1,IPC_CREAT|0666)) == -1)    {      perror("semget error!\n");      exit(1);    }printf("semid:%d\n",semid);printf("The num of available resource is %d \n",arg.val);/*int semctl(int semid, int semnum, int cmd, ...);Set the value of semval to arg.val for the semnum-th semaphore of the set*/if (semctl(semid,0,SETVAL,arg) == -1)    {      perror("semctl error!\n");      exit(1);    }/* Each operation is performed on the sem_num-th semaphore of the semaphore set,  * where the first semaphore of the set is numbered 0. */ struct sembuf sops; sops.sem_num = 0;        /* Operate on semaphore 0 */     sops.sem_op = -1;        /* the absolute value of sem_op is subtracted from semval */     sops.sem_flg = IPC_NOWAIT;while (1)    {    if (semop(semid,&sops,1) == -1)    {    perror("semop error!\n");puts("exit while1");semctl(semid,0,IPC_RMID,0);//Immediately remove the semaphore set    exit(1);   }    sleep(3);    }exit(0);}

程序2:

#include <sys/types.h>#include<stdlib.h>#include <sys/sem.h>#include <unistd.h>#include<stdio.h>int main(void){key_t key;int semid,semval;union semun{int val;struct semid_ds*buf;unsigned short *array;struct seminfo*__buf;}arg;if ((key = ftok(".",'c')) == -1)    {      perror("key error!\n");      exit(1);    }/* create sem set */if ((semid = semget(key,1,IPC_CREAT|0666)) == -1)    {      perror("semget error!\n");      exit(1);    }while(1)    {//Return the value of semval for the semnum-th semaphore of the set.      if ((semval = semctl(semid,0,GETVAL,0)) == -1)      {    perror("semctl error!\n");    exit(1);    }    if (semval > 0)    {    printf("There are %d resource is available\n",semval);    }    else    {    printf("Resource temporarily unavailable\n");    break;    }    sleep(3);    }exit(0);}


原创粉丝点击