11、信号量(三进程)

三个进程实现ABCABCABC…的有序打印:
在这里插入图片描述

设置三个信号量:

sem.h

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<sys/sem.h>
  4 
  5 #define SEM_NUM 3
  6 #define SEM1 0
  7 #define SEM2 1
  8 #define SEM3 2
  9 
 10 union semun
 11 {
 12     int val;
 13 };
 14 
 15 int sem_init();
 16 void sem_p(int index);//0 1 2
 17 void sem_v(int index);
 18 void sem_destory();

sem.c

  1 #include"sem.h"
  2 
  3 static int semid = -1;
  4 union semum
  5 {
  6     int val;
  7 };
  8 
  9 int sem_init()
 10 {
 11  semid = semget((key_t)1234,SEM_NUM,IPC_CREAT|IPC_EXCL|0600);
 12  if(semid==-1)
 13  {
 14     semid = semget((key_t)1234,SEM_NUM,0600);
 15     if(semid==-1)
 16     {
 17         printf("semget err\n");
 18         return-1;
 19     }
 20  }
 21  else
 22  {
 23    int arr[SEM_NUM]={1,0,0};
 24    for(int i=0;i<SEM_NUM;i++)
 25    {
 26        union semum a;
 27        a.val =arr[i];
 28        if(semctl(semid,i,SETVAL,a)==-1)
  29        {
 30            printf("semctl err\n");
 31            return -1;
 32        }
 33    }
 34  }
 35 }
 36 void sem_p(int index)//0 1 2
 37 {
 38  if(index<0||index>=SEM_NUM)
 39  {
 40      return;
 41  }
 42  struct sembuf buf;
 43  buf.sem_num=index;
 44  buf.sem_op=-1;
 45  buf.sem_flg=SEM_UNDO;//
 46  if(semop(semid,&buf,1)==-1)
 47  {
 48      return;
 49  }
 50 }
 51 void sem_v(int index)
 52 {
 53 if(index<0||index>=SEM_NUM)
 54  {
 55        return;
 56  }
  57  struct sembuf buf;
 58  buf.sem_num=index;
 59  buf.sem_op=1;
 60  buf.sem_flg=SEM_UNDO;//
 61  if(semop(semid,&buf,1)==-1)
 62    {
 63        return;
 64    }
 65 }
 66 void sem_destory()
 67 {
 68 if(semctl(semid,0,IPC_RMID)==-1)
 69 {
 70     return;
 71 }
 72 }

A.c

  1 #include<stdio.h>
  2 #include"sem.h"
  3 
  4 int main()
  5 {
  6     int res =sem_init();
  7     if(res==-1)
  8     {
  9         return 0;
 10     }
 11     for(int i=0;i<5;i++)
 12     {
 13         sem_p(SEM1);
 14         printf("A");
 15         fflush(stdout);
 16         sleep(1);
 17         sem_v(SEM2);
 18     }
 19 }

B.c

  1 #include<stdio.h>
  2 #include"sem.h"
  3 
  4 int main()
  5 {
  6     int res =sem_init();
  7     if(res==-1)
  8     {
  9         return 0;
 10     }
 11     for(int i=0;i<5;i++)
 12     {
 13         sem_p(SEM2);
 14         printf("B");
 15         fflush(stdout);
 16         sleep(1);
 17         sem_v(SEM3);
 18     }
 19 }

C.c

  1 #include<stdio.h>
  2 #include"sem.h"
  3 
  4 int main()
  5 {
  6     int res =sem_init();
  7     if(res==-1)
  8     {
  9         return 0;
 10     }
 11     for(int i=0;i<5;i++)
 12     {
 13         sem_p(SEM3);
 14         printf("C");
 15         fflush(stdout);
 16         sleep(1);
 17         sem_v(SEM1);
 18     }
 19 }

运行结果:

stu@stu-virtual-machine:~/Test/信号量举例/三信号量$ ./A& ./B& ./C&
[1] 3653
[2] 3654
[3] 3655
stu@stu-virtual-machine:~/Test/信号量举例/三信号量$ ABCABCABCABCABC
[1]   已完成               ./A
[2]-  已完成               ./B
[3]+  已完成               ./C

B& ./C&
[1] 3653
[2] 3654
[3] 3655
stu@stu-virtual-machine:~/Test/信号量举例/三信号量$ ABCABCABCABCABC
[1] 已完成 ./A
[2]- 已完成 ./B
[3]+ 已完成 ./C


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值