信号同步
来源:互联网 发布:java两个日期相差年数 编辑:程序博客网 时间:2024/05/18 19:43
信号同步 (多个进程访问同一临界资源,再通过同一信号量控制)实现同步
在头文件下<sys/sem.h>
信号量的几个函数api
int semget(key_t key,int num_sems,int sem_flgs)
key是整数值两个进程可以通过同key访问同意信号量 int num_sems 为信号量的数目 sem_flags 是创建者才能访问到的
int semget(key_t key,int num_sems,int sem_flgs)
int semop(int sem_id,struct sembuf *sem_ops,size_t num_sem_ops)
int semctl(int sem_id ,int sem_num,int command,...)
组的信号量时就要用到 sem_num;
例1
sem.h
#include <stdio.h>#include <signal.h>#include <fcntl.h>#include <stdlib.h>#include <sys/sem.h>union semun{int val;};void sem_init();void sem_p();void sem_v();void del_sem();sem.c
#include "sem.h"static int semid=-1;void sem_init(){semid =semget((key_t)1234,1,IPC_CREAT | IPC_EXCL | 0600);if(semid==-1){semid=semget((key_t)1234,1,0600);if(semid==-1){perror("erro");}}else//{union semun a;a.val=1;if(semctl(semid,0,SETVAL,a)==-1){printf("semctl erro");}}}void sem_p(){struct sembuf a;a.sem_num=0;a.sem_op=-1;a.sem_flg=SEM_UNDO;if(semop(semid,&a,1)==-1){perror("erro");}}void sem_v(){struct sembuf a; a.sem_num=0; a.sem_op=1; a.sem_flg=SEM_UNDO;if(semop(semid,&a,1)==-1){perror("erro");}}void del_sem(){union semun sem_union;if(semctl(semid,0,IPC_RMID)==-1){perror("erro");}}
b.c
#include <stdio.h>#include "sem.h"int main(){int i=0;sem_init();int n;for(;i<10;i++){sem_p();printf("b");fflush(stdout); n=rand()%3;sleep(n);printf("b");fflush(stdout); n=rand()%3;sleep(n);sem_v();}sleep(8);del_sem();exit(0);}
a.c
#include <stdio.h>#include "sem.h"int main(){int i=0;sem_init();int n;for(;i<10;i++){sem_p();printf("A");fflush(stdout); n=rand()%3;sleep(n);printf("A");fflush(stdout); n=rand()%3;sleep(n);sem_v();}exit(0);}
输出结果
解决了输出不同步问题,两个进程公用一个输出。
0 0
- 同步信号
- 信号同步
- c#多线程同步,信号
- SSI同步串行信号
- LTE-同步信号
- LTE学习:同步信号
- 信号同步机制
- TFT屏同步信号
- UCOSIII-信号同步
- 同步信号PSS , SSS
- 同步信号与异步信号的区别
- 同步信号与异步信号的问题
- LTE-产生参考信号和同步信号
- 使用信号进行同步(ZZ)
- 使用信号实现线程同步
- 信号实现父子进程同步
- linux线程同步之信号
- 进程同步--信号实现--APUE
- const用法
- easyui-datebox前一个选择了日期,后一个只能该日期之后的日期,或是一个周之后的日期
- ZCMU—1556
- Spring MVC中加载配置properties文件(以配置Redis为例)
- 数据结构草稿
- 信号同步
- IntelliJ中的main函数和System.out.println()快捷键
- 内核对象
- 在PyCharm环境中使用Jupyter Notebook的两种方法
- 蓝桥杯训练:爆搜——求年龄
- js点击某个图标或按钮弹出文件选择框
- 项目记录-凸包修正
- Linux下连接Mysql
- word中查找和搜索的通配符