Chinaunix首页 | 论坛 | 博客
  • 博客访问: 338185
  • 博文数量: 73
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1293
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-07 11:17
个人简介

爱运动,爱看书,爱生活!

文章分类

全部博文(73)

文章存档

2014年(7)

2013年(66)

分类: C/C++

2013-08-01 20:56:03

信号量实质上就是一个计数器,可以控制进程对数据的共享,可以利用他实现两个进程的同步,
也就是两个进程相互控制,达到进程同步效果。下面用两个程序说明。
两个程序的功能结构:
A:程序

1.创建信号量
2.初始化信号量中指定下标的值
3.根据信号量设置阻塞
4.删除信号量
B:程序
1.得到信号量
2.解除阻塞
程序A

点击(此处)折叠或打开

  1. //程序A
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <sys/ipc.h>
  6. #include <sys/sem.h>

  7.  int main()
  8. {
  9.     key_t key;
  10.     int semid;
  11.     int r;
  12.     struct sembuf op[1];//定义1个操作
  13.     //1.创建信号量
  14.     key = ftok( ".",99 );
  15.     if( -1==key )
  16.      printf( "ftok error:%m\n"),exit(-1);
  17.     
  18.     
  19.      semid = semget( key,1//信号量数组个数
  20.                 ,IPC_CREAT | IPC_EXCL | 0666 );
  21.         
  22.     if( -1==semid ) printf("get error:%m\n"),exit(-1);
  23.    
  24.     //2.初始化信号量
  25.     //2.1 定义一个联合体,库没给我们定义,因为它是可变的
  26.     union semun{
  27.         int value;
  28.         struct sem_id_ds *buf;
  29.         unsigned short *array;
  30.         struct seminfo *_buf;
  31.     };
  32.     //2.2 定义初始化值
  33.     union     semun v;
  34.     //2.3 设置初始值
  35.     v.value = 2;
  36.     r = semctl( semid,0/*下标*/,SETVAL,v );//设置信号量的值
  37.     if( -1==r ) printf("初始化失败:%m\n"),exit(-1);
  38.     
  39.     //3.对信号量阻塞操作
  40.     //3.1 定义操作
  41.     op[0].sem_num = 0;//信号量下标
  42.      op[0].sem_op = -1;//信号量操作单位与类型,信号量的值大于等于0
  43.      op[0].sem_flg = 0;//操作标记
  44.      while(1){    
  45.         r = semop( semid,op,1 );//每次减一
  46.         printf( "解除阻塞\n" );
  47.     }
  48.     //4.删除信号量(可以不删除)
  49.     //semclt( semid,0,IPC_RMID);
  50.     

  51. }
程序B

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <sys/ipc.h>
  5. #include <sys/sem.h>

  6. int main()
  7. {
  8.     key_t key;
  9.     int semid;
  10.     int r;
  11.     struct sembuf op[2];
  12.     //1创建信号量
  13.     key = ftok( ".",99 );
  14.     if( key==-1 ) printf( "ftok error:%m\n"),exit( -1 );
  15.     
  16.     semid = semget( key,1,0 );//得到信号量
  17.         
  18.     if( -1==semid ) printf( "get error:%m\n"),exit(-1);    

  19.     //3.对信号量阻塞操作
  20.     //3.1 定义操作
  21.     op[0].sem_num = 0;//信号量下标
  22.      op[0].sem_op = 1;//信号量操作单位与类型,
  23.      op[0].sem_flg = 0;//操作标记
  24.      op[1].sem_num = 0;//信号量下标
  25.      op[1].sem_op = 1;//信号量操作单位与类型,每次再加一
  26.      op[1].sem_flg = 0;//操作标记
  27.      while(1){    
  28.         r = semop( semid,op,2 );
  29.         sleep( 1 );//每隔一秒两个加1操作,两个进程相互控制,实现同步
  30.     }
  31.     //4.删除信号量(可以不删除)
  32.     //semctl( semid,0,IPC_RMID );
  33.     return 0;
  34. }
这样实现了这两个进程的同步,不会混乱。




阅读(2718) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~