信号量实现两个进程间的通信

时间:2021-03-03 15:12:53

信号量讲解:点击打开链接

运行截图:

信号量实现两个进程间的通信

getRec.c

#include<sys/types.h>
#include<linux/sem.h>
#include<stdlib.h>
#include<stdio.h>

//假设系统中有四个资源,该进程每隔三秒占用一个资源
#define RESOURCE 4
int main(void)
{
    key_t key;
    int semid;
    struct sembuf sbuf={0,-1,IPC_NOWAIT};
    union semun arg;

    //创建进程
    if((key=ftok("/home/liang/MyLearn/sem",'c'))==-1)
    {
      perror("ftok error!\n");
      exit(1);
    }
    //创建信号量
    if((semid=semget(key,1,IPC_CREAT|0666))==-1)
    {
      perror("semget error!\n");
      exit(1);
    }
    //指定资源数
    arg.val=RESOURCE;
    printf("可使用资源共有%d个!\n",arg.val);
    //设置资源值
    if(semctl(semid,0,SETVAL,arg)==-1)
    {
      perror("semctl error!\n");
      exit(1);
    }
    //占用资源
    while(1)
    {
      if(semop(semid,&sbuf,1)==-1)
         {
           perror("semop error!");
           //删除信号量
            semctl(semid,0,IPC_RMID,0);
           exit(1);
         }
         sleep(3);
    }
    exit(0);
}

returnRec.c

#include<sys/types.h>
#include<linux/sem.h>
#include<stdlib.h>
#include<stdio.h>

//显示可用资源的个数
int main(void)
{
    key_t key;
    int semid,semval;
    union semun arg;

    //创建进程
    if((key=ftok("/home/liang/MyLearn/sem",'c'))==-1)
    {
      perror("ftok error!\n");
      exit(1);
    }
    //创建信号量
    if((semid=semget(key,1,IPC_CREAT|0666))==-1)
    {
      perror("semget error!\n");
      exit(1);
    }

    while(1)
    {
        if((semval=semctl(semid,0,GETVAL,0))==-1)
        {
           perror("semctl error");
           //删除信号量
           semctl(semid,0,IPC_RMID,0);
           exit(1);
        }
        if(semval>0)
        {
           printf("还有%d个资源可以使用!\n",semval);
        }else{
           printf("没有资源可以使用!\n");
           break;
        }
         sleep(3);
    }
    
    exit(0);
}