IPC 信号量(semaphore)
来源:互联网 发布:淘宝最靠谱的aj店 编辑:程序博客网 时间:2024/06/11 06:54
实现原理,是通过信号量的PV操作来实现进程之间的切换
typedef union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
struct seminfo *__buf;
}SEMUN;
/初始化/
int init_sem(int id,int init_val)
{
SEMUN un;
un.val = init_val;
int ret = semctl(id,0,SETVAL,un);
}
/P操作/
int sem_P(int id)
{
struct sembuf buf;
buf.sem_num = 0;
buf.sem_op = -1;
buf.sem_flg = SEM_UNDO;
int ret = semop(id,&buf,1);
if(-1 == ret)
{
perror(“P”);
exit(1);
}
return ret;
}
/V操作/
int sem_V(int id)
{
struct sembuf buf;
buf.sem_num = 0;
buf.sem_op = +1;
buf.sem_flg = SEM_UNDO;
int ret = semop(id,&buf,1);
if(-1 == ret)
{
perror(“v”);
exit(1);
}
return ret;
}
int main(int argc, const char *argv[])
{
key_t key = ftok(“./”,’!’);//key值可以通过三种方法获得。
if(-1 == key )
{
perror(“ftok”);
exit(1);
}
int shmid = shmget(key,4096,IPC_CREAT|0666);
if(-1 == shmid)
{
perror(“shmget”);
exit(1);
}
void* p = shmat(shmid,NULL,0);
if((void*)-1 == p)//唯一一个指针的返回值不为NULL的。
{
perror(“shmat”);
exit(1);
}
int semid = semget(key,1,IPC_CREAT|0666);
if(-1== semid)//相当于有个小名
{
perror(“semget”);
exit(1);
}
init_sem(semid,1);
int i = 10;
sem_P(semid);
while(i–)
{
(int )p = i;
printf(“%d\n”,i);
sleep(1);
}
sem_V(semid);
shmdt(p);
return 0;
}
- IPC 信号量(semaphore)
- IPC——信号量(semaphore)
- IPC--信号量 Semaphore 生产者 消费者模型 (semget semop semctl)
- 进程间通信(IPC):信号量(Semaphore)
- 信号量semaphore
- 信号量Semaphore
- 信号量semaphore
- 信号量Semaphore
- 信号量Semaphore
- 信号量Semaphore
- 信号量semaphore
- semaphore信号量
- 信号量Semaphore
- 信号量 semaphore
- 信号量 semaphore
- 信号量Semaphore
- Semaphore信号量
- 信号量semaphore
- Keil_uvision 基本使用教程
- ios中的通知和推送
- 河南省第十届ACM省赛题目:问题 F: Binary to Prime
- 添加自定义层- 打印precision-recall的调和平均指标F1值
- 最完美的Linux桌面软件
- IPC 信号量(semaphore)
- C++ 共用体 枚举 结构体 介绍
- JSP 弹出对话框的方式总结
- MyBatis插入单条数据
- (null) entry in command string: null chmod 0700的解决方法
- POJ-2955-Brackets
- [学习笔记]Android RecyclerView
- 弱网测试
- centos 部署 tomcat 指定 jre版本