康复医学与理疗学就业:实验 信号量实现进程同步
来源:百度文库 编辑:偶看新闻 时间:2024/04/27 21:53:50
#include
#include
#include
#include
#include
#include
#include
#include
#define MAXSEM 5
/*声明3个信号量ID*/
int fullid;
int emptyid;
int mutxid;
int main(){
struct sembuf P,V;
union semun arg;
/* 声明共享主存*/
int *array;
int *sum;
int *set;
int *get;
/*将array、sum、set和 get映射到共享主存*/
array=(int *)shmat(shmget(IPC_PRIVATE,sizeof(int)*MAXSEM,IPC_CREAT|0666),0,0);
sum=(int *)shmat(shmget(IPC_PRIVATE,sizeof(int),IPC_CREAT|0666),0,0);
set=(int *)shmat(shmget(IPC_PRIVATE,sizeof(int),IPC_CREAT|0666),0,0);
get=(int *)shmat(shmget(IPC_PRIVATE,sizeof(int),IPC_CREAT|0666),0,0);
*get=0;
/* 创建信号量*/
fullid=semget(IPC_PRIVATE,1,IPC_CREAT|0666);
emptyid=semget(IPC_PRIVATE,1,IPC_CREAT|0666);
mutxid=semget(IPC_PRIVATE,1,IPC_CREAT|0666);
/* 为信号量赋值*/
arg.val=0;
if(semctl(fullid,0,SETVAL,arg)==-1) perror("semctl setval error");
arg.val=MAXSEM;
if(semctl(emptyid,0,SETVAL,arg)==-1) perror("semctl setval error");
arg.val=1;
if(semctl(mutxid,0,SETVAL,arg)==-1) perror("semctl setval error");
/*初始化P、V操作*/
P.sem_num=0;
P.sem_op=-1;
P.sem_flg=SEM_UNDO;
V.sem_num=0;
V.sem_op=1;
V.sem_flg=SEM_UNDO;
/* 创建生产者进程*/
if(fork()==0){
int i=0;
*set=0;
while(i<10){
semop(emptyid,&P,1);
semop(mutxid,&P,1);
array[(*set)%MAXSEM]=i+1;
//printf("Producer put number %d to No.%d\n",array[(*set)%MAXSEM],(*set)%MAXSEM);
(*set)++;
semop(mutxid,&V,1); //对mutxid执行 V 操作
semop(fullid,&V,1); //对fullid执行 V 操作
i++;
}
sleep(3);
printf("生产者结束");
exit(0);
}else{
/* 创建消费者进程A*/
if(fork()==0){
while(1){
semop(fullid,&P,1); //对fullid执行 P 操作
semop(mutxid,&P,1); //对mutxid执行 P 操作
if(*get==10)
break;
(*sum)+=array[(*get)%MAXSEM];
printf("The ComsumerA Get Number %d\n",array[(*get)%MAXSEM]);
(*get)++;
if(*get==10)
printf("The sum is %d\n",*sum);
semop(mutxid,&V,1);
semop(emptyid,&V,1);
sleep(1);
}
printf(" 消费者A结束");
exit(0);
}else{
/*创建消费者进程B*/
if(fork()==0){
while(1){
semop(fullid,&P,1); //对fullid执行 P 操作
semop(mutxid,&P,1); //对mutxid执行 P 操作
if(*get==10)
break;
(*sum)+=array[(*get)%MAXSEM];
printf("The ComsumerB Get Number %d\n",array[(*get)%MAXSEM]);
(*get)++;
if(*get==10)
printf("The sum is %d\n",*sum);
semop(mutxid,&V,1);
semop(emptyid,&V,1);
sleep(1);
}
printf(" 消费者B结束");
exit(0);
}
}
}
/* 父进程返回后回收3个子进程 */
wait(0);
wait(0);
wait(0);
/* 撤消3个信号量集 */
semctl(emptyid,IPC_RMID,0);
semctl(fullid,IPC_RMID,0);
semctl(mutxid,IPC_RMID,0);
exit(0);
}
#include
#include
#include
#include
#include
#include
#include
#define MAXSEM 5
/*声明3个信号量ID*/
int fullid;
int emptyid;
int mutxid;
int main(){
struct sembuf P,V;
union semun arg;
/* 声明共享主存*/
int *array;
int *sum;
int *set;
int *get;
/*将array、sum、set和 get映射到共享主存*/
array=(int *)shmat(shmget(IPC_PRIVATE,sizeof(int)*MAXSEM,IPC_CREAT|0666),0,0);
sum=(int *)shmat(shmget(IPC_PRIVATE,sizeof(int),IPC_CREAT|0666),0,0);
set=(int *)shmat(shmget(IPC_PRIVATE,sizeof(int),IPC_CREAT|0666),0,0);
get=(int *)shmat(shmget(IPC_PRIVATE,sizeof(int),IPC_CREAT|0666),0,0);
*get=0;
/* 创建信号量*/
fullid=semget(IPC_PRIVATE,1,IPC_CREAT|0666);
emptyid=semget(IPC_PRIVATE,1,IPC_CREAT|0666);
mutxid=semget(IPC_PRIVATE,1,IPC_CREAT|0666);
/* 为信号量赋值*/
arg.val=0;
if(semctl(fullid,0,SETVAL,arg)==-1) perror("semctl setval error");
arg.val=MAXSEM;
if(semctl(emptyid,0,SETVAL,arg)==-1) perror("semctl setval error");
arg.val=1;
if(semctl(mutxid,0,SETVAL,arg)==-1) perror("semctl setval error");
/*初始化P、V操作*/
P.sem_num=0;
P.sem_op=-1;
P.sem_flg=SEM_UNDO;
V.sem_num=0;
V.sem_op=1;
V.sem_flg=SEM_UNDO;
/* 创建生产者进程*/
if(fork()==0){
int i=0;
*set=0;
while(i<10){
semop(emptyid,&P,1);
semop(mutxid,&P,1);
array[(*set)%MAXSEM]=i+1;
//printf("Producer put number %d to No.%d\n",array[(*set)%MAXSEM],(*set)%MAXSEM);
(*set)++;
semop(mutxid,&V,1); //对mutxid执行 V 操作
semop(fullid,&V,1); //对fullid执行 V 操作
i++;
}
sleep(3);
printf("生产者结束");
exit(0);
}else{
/* 创建消费者进程A*/
if(fork()==0){
while(1){
semop(fullid,&P,1); //对fullid执行 P 操作
semop(mutxid,&P,1); //对mutxid执行 P 操作
if(*get==10)
break;
(*sum)+=array[(*get)%MAXSEM];
printf("The ComsumerA Get Number %d\n",array[(*get)%MAXSEM]);
(*get)++;
if(*get==10)
printf("The sum is %d\n",*sum);
semop(mutxid,&V,1);
semop(emptyid,&V,1);
sleep(1);
}
printf(" 消费者A结束");
exit(0);
}else{
/*创建消费者进程B*/
if(fork()==0){
while(1){
semop(fullid,&P,1); //对fullid执行 P 操作
semop(mutxid,&P,1); //对mutxid执行 P 操作
if(*get==10)
break;
(*sum)+=array[(*get)%MAXSEM];
printf("The ComsumerB Get Number %d\n",array[(*get)%MAXSEM]);
(*get)++;
if(*get==10)
printf("The sum is %d\n",*sum);
semop(mutxid,&V,1);
semop(emptyid,&V,1);
sleep(1);
}
printf(" 消费者B结束");
exit(0);
}
}
}
/* 父进程返回后回收3个子进程 */
wait(0);
wait(0);
wait(0);
/* 撤消3个信号量集 */
semctl(emptyid,IPC_RMID,0);
semctl(fullid,IPC_RMID,0);
semctl(mutxid,IPC_RMID,0);
exit(0);
}
试写出利用信号量机制实现两任务共享单缓冲区的同步算法。
“用信号量使任务和中断服务同步”是什么同步?这种同步又是什么?
有十个进程,互斥使用资源.求信号量S的范围
如何用二值(仅取0或1)信号量P,V操作实现一般(多值)信号量的P,V操作?
信号量问题
怎样实现歌曲歌词同步下载
如何实现歌词同步播放
怎样实现MP3歌词同步?
MP3如何实现歌词同步
如何实现MP3歌词同步
怎样实现歌曲歌词同步下载
局域网如何实现时间同步?
怎样实现sql2000同步备份?
对进程的管理和控制使用什么?A指令B原语C信号量D信箱
求一个C语言程序,实现父、子进程之间进行CPU的竞争与同步的过程。。。编程高手帮忙啊!!
进程的同步与互斥间的联系
列举几个经典的进程同步问题
java实现歌词同步代码下载
如何实现网络同步传输视频画面?
mp3怎么实现歌词同步显示啊?
如何实现MP3歌词同步显示
怎样用LRC文件实现MP3歌词同步?
MP3的歌词同步怎么实现?
如何实现歌词与歌曲同步?