【Linux基础】信号量应用实例

信号量相关函数
System V信号量所用到的基本系统调用有三个:函数semget()是创建一个新信号量或取得一个已有信号量的键。函数semop函数用于改变信号量的值。函数semctl允许直接控制信号量信息。
信号量相关函数的语法如表 9‑10、表 9‑11、表 9‑12和表 9‑13所示:

01.jpg (35.81 KB, 下载次数: 0)

下载附件 保存到相册 设为封面

2013-6-12 08:12 上传

02.jpg (48.03 KB, 下载次数: 0)

下载附件 保存到相册 设为封面

2013-6-12 08:13 上传

03.jpg (45.77 KB, 下载次数: 0)

下载附件 保存到相册 设为封面

2013-6-12 08:14 上传

04.jpg (64.19 KB, 下载次数: 0)

下载附件 保存到相册 设为封面

2013-6-12 08:14 上传

2. 信号量实例
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<sys/types.h>
#include<sys/sem.h>
#include<sys/ipc.h>
union semun{
int val;
struct semid_ds *buf;
unsigned short *array;
};
static int set_semvalue(void);
static void del_semvalue(void);
static int semaphore_p(void);
static int semaphore_v(void);
static int sem_id;
int main(int argc,char *argv[])
{
int i;
int pause_time;
char op_char ='0';
srand((unsigned int)getpid());
sem_id=semget((key_t)1234,1,0666 | IPC_CREAT);
if(argc>1)
{
if(!set_semvalue())
{
printf("Failed to initialize semaphore\n");
return 1;
}
op_char='X';
sleep(2);
}
for(i=0;i<10;i++)
{
if(!semaphore_p())
return 1;
printf("%c",op_char);
pause_time =rand()%3;
sleep(pause_time);
printf("%c",op_char);
fflush(stdout);
if(!semaphore_v())
return 1;
pause_time = rand()%2;
sleep(pause_time);
}
printf("\n%d - finished\n",getpid());
if(argc>1)
{
sleep(10);
del_semvalue();
}
return 0;
}
static int set_semvalue(void)
{
union semun sem_union;
sem_union.val =1;
if(semctl(sem_id,0,SETVAL,sem_union)==-1) return(0);
return (1);
}
static void del_semvalue(void)
{
union semun sem_union;
if(semctl(sem_id,0,IPC_RMID,sem_union)==-1)
printf("Failed to delete semaphore\n");
}
static int semaphore_p(void)
{
struct sembuf sem_b;
sem_b.sem_num=0;
sem_b.sem_op=-1;
sem_b.sem_flg=SEM_UNDO;
if(semop(sem_id,&sem_b,1)==-1)
{
printf("semaphore_p failed\n");
return (0);
}
return (1);
}
static int semaphore_v(void)
{
struct sembuf sem_b;
sem_b.sem_num=0;
sem_b.sem_op=1;
sem_b.sem_flg=SEM_UNDO;
if(semop(sem_id,&sem_b,1)==-1)
{
printf("semaphore_v failed\n");
return 0;
}
return 1;
}
运行结果:
[root@local host sem]# ./seml 8
XXXXXXXXXXXXXXXXXXXX
31864 - finished

本文转载于唯C教育,【Linux基础】信号量应用实例
http://www.weicedu.com/forum.php?mod=viewthread&tid=185&fromuid=4
(出处: http://www.weicedu.com/)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值