信号同步

来源:互联网 发布: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
原创粉丝点击