信号量的实现和应用

一 源代码
/*
    Ubuntu_pc.c
    Ubuntu16.04下关于生产者和消费者的示例程序,首先创建一个进程为生产者,往文件缓冲区里面写数字,然
    后创建一组消费者进程,从文件缓冲区里面读数字输出到终端,同时显示子进程的PID.进程之间的同步和临界
    资源的互斥访问通过信号量来实现.
*/
#include<stdio.h>
#include<semaphore.h>
#include<fcntl.h>
#include<unistd.h>

#define TOTALNUMS 512 //生产者生产的总数
#define CHILDPROCS 8 //消费者进程数量
#define BUFSIZE 10 //缓冲区大小
#define OPENFLAG (O_CREAT|O_TRUNC|O_RDWR) //文件无则创建,有则清空,读写打开

int main(int argc,char* argv[]){
  sem_t *empty,*full,*mutex;
  int fd;
  pid_t p;
  int buf_in=0;
  int buf_out=0;
  int i,j,data;

//创建三个信号量,empty和full用来实现读写同步,mutex用来实现临界资源的互斥访问
  if((empty=sem_open("empty", OPENFLAG, 0666,BUFSIZE))==SEM_FAILED){
    perror("sem_open() error");
    return -1;
  }
  if((full=sem_open("full", OPENFLAG, 0666,0))==SEM_FAILED){
    perror("sem_open() error");
    return -1;
  }
  if((mutex=sem_open("mutex",OPENFLAG,0666,1))==SEM_FAILED){
    perror("sem_open() error");
    return -1;
  }
  //打开文件缓冲区
  if((fd=open("buffer", OPENFLAG, 0666))==-1){
    perror("open() error");
    return -1;
  }

//保存消费者读取数据在缓冲区中的索引
  lseek(fd, sizeof(int)*BUFSIZE, SEEK_SET);
  write(fd,&buf_out,sizeof(int));

  if((p=fork())==0){
  //生产者往缓冲区中写数字
    for(i=0;i<TOTALNUMS;i++){
      sem_wait(empty);//申请empty资源
      sem_wait(mutex);//锁定缓冲区
      lseek(fd, sizeof(int)*buf_in, SEEK_SET);//写数字
      write(fd,&i,sizeof(int));
      buf_in=(buf_in+1)%BUFSIZE;//更新写索引
      sem_post(mutex);//释放缓冲区
      sem_post(full);//生产full资源
    }
    return 0;
  }else if(p<0){
    perror("fork() error");
    return -1;
  }

  for(i=0;i<CHILDPROCS;i++){
  //消费者从缓冲区读数字
    if((p=fork())==0){
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值