信号量实质上就是一个计数器,可以控制进程对数据的共享,可以利用他实现两个进程的同步,
也就是两个进程相互控制,达到进程同步效果。下面用两个程序说明。
两个程序的功能结构:
A:程序
1.创建信号量
2.初始化信号量中指定下标的值
3.根据信号量设置阻塞
4.删除信号量
B:程序
1.得到信号量
2.解除阻塞
程序A
-
//程序A
-
#include <stdio.h>
-
#include <stdlib.h>
-
#include <unistd.h>
-
#include <sys/ipc.h>
-
#include <sys/sem.h>
-
-
int main()
-
{
-
key_t key;
-
int semid;
-
int r;
-
struct sembuf op[1];//定义1个操作
-
//1.创建信号量
-
key = ftok( ".",99 );
-
if( -1==key )
-
printf( "ftok error:%m\n"),exit(-1);
-
-
-
semid = semget( key,1//信号量数组个数
-
,IPC_CREAT | IPC_EXCL | 0666 );
-
-
if( -1==semid ) printf("get error:%m\n"),exit(-1);
-
-
//2.初始化信号量
-
//2.1 定义一个联合体,库没给我们定义,因为它是可变的
-
union semun{
-
int value;
-
struct sem_id_ds *buf;
-
unsigned short *array;
-
struct seminfo *_buf;
-
};
-
//2.2 定义初始化值
-
union semun v;
-
//2.3 设置初始值
-
v.value = 2;
-
r = semctl( semid,0/*下标*/,SETVAL,v );//设置信号量的值
-
if( -1==r ) printf("初始化失败:%m\n"),exit(-1);
-
-
//3.对信号量阻塞操作
-
//3.1 定义操作
-
op[0].sem_num = 0;//信号量下标
-
op[0].sem_op = -1;//信号量操作单位与类型,信号量的值大于等于0
-
op[0].sem_flg = 0;//操作标记
-
while(1){
-
r = semop( semid,op,1 );//每次减一
-
printf( "解除阻塞\n" );
-
}
-
//4.删除信号量(可以不删除)
-
//semclt( semid,0,IPC_RMID);
-
-
-
}
程序B
-
#include <stdio.h>
-
#include <stdlib.h>
-
#include <unistd.h>
-
#include <sys/ipc.h>
-
#include <sys/sem.h>
-
-
int main()
-
{
-
key_t key;
-
int semid;
-
int r;
-
struct sembuf op[2];
-
//1创建信号量
-
key = ftok( ".",99 );
-
if( key==-1 ) printf( "ftok error:%m\n"),exit( -1 );
-
-
semid = semget( key,1,0 );//得到信号量
-
-
if( -1==semid ) printf( "get error:%m\n"),exit(-1);
-
-
//3.对信号量阻塞操作
-
//3.1 定义操作
-
op[0].sem_num = 0;//信号量下标
-
op[0].sem_op = 1;//信号量操作单位与类型,
-
op[0].sem_flg = 0;//操作标记
-
op[1].sem_num = 0;//信号量下标
-
op[1].sem_op = 1;//信号量操作单位与类型,每次再加一
-
op[1].sem_flg = 0;//操作标记
-
while(1){
-
r = semop( semid,op,2 );
-
sleep( 1 );//每隔一秒两个加1操作,两个进程相互控制,实现同步
-
}
-
//4.删除信号量(可以不删除)
-
//semctl( semid,0,IPC_RMID );
-
return 0;
-
}
这样实现了这两个进程的同步,不会混乱。
阅读(2718) | 评论(0) | 转发(1) |