用system V信号量实现进程同步的例子
来源:互联网 发布:中国移动网络办理 编辑:程序博客网 时间:2024/06/03 07:14
以下是一个system V的信号量同步例子,共5个进程,P1,P2,P3,P4,P5。同步关系是P1最先执行;P2、P3、P4都是等待P1完成之后才能执行,P5等待P2,P3,P4全部完成之后才能执行。
#include <stdio.h>
#include <sys/sem.h>
#include <sys/ipc.h>
#include <sys/types.h>
#define KEY1 1211
#define KEY2 1212
#define KEY3 1213
#define KEY4 1214
#define KEY5 1215
#define KEY6 1216
union semun{
int val;
struct semid_ds *buf;
unsigned short *array;
};
int crt_sem(key_t key, int val)
{
union semun arg;
int id = semget(key, 1, IPC_CREAT);
arg.val = val;
semctl(id, 0, SETVAL, arg);
return id;
}
void P(int semid)
{
struct sembuf p[1];
p[0].sem_num = 0;
p[0].sem_op = -1;
p[0].sem_flg = 0;
semop(semid, p, 1);
}
void V(int semid)
{
struct sembuf v[1];
v[0].sem_num = 0;
v[0].sem_op = 1;
v[0].sem_flg = 0;
semop(semid, v, 1);
}
int
main(void)
{
int i = 1;
pid_t pid;
int t;
int p12 = crt_sem(KEY1, 0);
t = semctl(p12, 0, GETVAL);
printf("init value of p12 is %d./n");
int p13 = crt_sem(KEY2, 0);
t = semctl(p13, 0, GETVAL);
printf("init value of p13 is %d./n");
int p14 = crt_sem(KEY3, 0);
t = semctl(p14, 0, GETVAL);
printf("init value of p14 is %d./n");
int p25 = crt_sem(KEY4, 0);
t = semctl(p25, 0, GETVAL);
printf("init value of p25 is %d./n");
int p35 = crt_sem(KEY5, 0);
t = semctl(p35, 0, GETVAL);
printf("init value of p35 is %d./n");
int p45 = crt_sem(KEY6, 0);
t = semctl(p45, 0, GETVAL);
printf("init value of p45 is %d./n");
while (i < 6){
if ((pid = fork()) < 0){
printf("process fork error./n");
return(0);
}else if(pid == 0){
break;
}else{
i++;
}
}
if (i == 1){
sleep(1);
printf("----------------process1./n");
//printf("-----------before:%d/n",semctl(p12,0,GETVAL,0));
V(p12);
V(p13);
V(p14);
printf("p12 after process1:%d/n",semctl(p12,0,GETVAL,0));
printf("p13 after process1:%d/n",semctl(p13,0,GETVAL,0));
printf("p14 after process1:%d/n",semctl(p14,0,GETVAL,0));
}
if (i == 2){
sleep(2);
P(p12);
t = semctl(p12, 0, GETVAL, 0);
printf("--------------process2./n");
V(p25);
printf("p12 after process2:%d/n",semctl(p12,0,GETVAL,0));
printf("p25 after process2:%d/n",semctl(p25,0,GETVAL,0));
}
if (i == 3){
sleep(2);
P(p13);
printf("--------------process3./n");
V(p35);
printf("p13 after process3:%d/n",semctl(p13,0,GETVAL,0));
printf("p35 after process3:%d/n",semctl(p35,0,GETVAL,0));
}
if (i == 4){
sleep(2);
P(p14);
printf("--------------process4./n");
V(p45);
printf("p14 after process4:%d/n",semctl(p14,0,GETVAL,0));
printf("p45 after process4:%d/n",semctl(p45,0,GETVAL,0));
}
if (i == 5){
sleep(4);
P(p25);
P(p35);
P(p45);
printf("--------------process5./n");
printf("p25 after process5:%d/n",semctl(p25,0,GETVAL,0));
printf("p35 after process5:%d/n",semctl(p35,0,GETVAL,0));
printf("p45 after process5:%d/n",semctl(p45,0,GETVAL,0));
}
if (i == 6)
sleep(5);
return(0);
}
- 用system V信号量实现进程同步的例子
- Linux进程同步之System V 信号量
- Linux进程同步之System V 信号量
- system v 共享内存 + 匿名信号量 , 实现进程互斥
- posix信号量对system V共享内存的同步控制
- <linux进程>system-V信号量的基本操作
- 信号量实现进程同步
- linux进程通信之SYSTEM V信号量
- Linux系统编程——进程同步与互斥:System V 信号量
- 【Linux系统编程】进程同步与互斥:System V 信号量
- Linux系统编程——进程同步与互斥:System V 信号量
- 信号量实现多进程的同步访问
- Linux互斥与同步应用(五):system V信号量的互斥与同步
- linux网络编程之System V 信号量(二):用信号量实现进程互斥示例和解决哲学家就餐问题
- linux网络编程之System V 信号量(二):用信号量实现进程互斥示例和解决哲学家就餐问题
- 如何使用System V的信号量
- linux system V 信号量的初步理解
- 对System V命名信号量的封装类,用于进程/线程间互斥
- 三个囚犯分汤
- 上传图片和得到图片长宽大小的方法
- firefox快捷键切换窗口功能
- UML常用符号
- COOKIE注入经典原理
- 用system V信号量实现进程同步的例子
- QT 软键盘,物理键盘的完美实现
- Oracle数据库DBA日常Sql列表
- 细说UI线程和Windows消息队列
- 编程之美——2.7最大公约数
- 【贪吃蛇—Java程序员写Android游戏】系列 2. 用J2ME实现Android的Snake Sample预览
- 写博客的理由
- LINUX reference
- SQL Prompt 5.0:Exception within progress task