请问semop如何保证进程互斥访问临界区
时间:2010-08-26
来源:互联网
如果加上P ,V操作后,一个进程都打印完临界区所有内容后,另一个进程才会打印。
P,V操作可以保证多个进程对临界区的互斥访问这没错,但是本程序中,其实fork后的每个子进程都单一的在访问自己的临界区而已。
我现在不明白semop操作如何保证子进程在临界区访问时不受其他子进程的干扰,因为这不是多个进程共同访问一个临界区。
复制代码
P,V操作可以保证多个进程对临界区的互斥访问这没错,但是本程序中,其实fork后的每个子进程都单一的在访问自己的临界区而已。
我现在不明白semop操作如何保证子进程在临界区访问时不受其他子进程的干扰,因为这不是多个进程共同访问一个临界区。
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/sem.h>
- #include <stdlib.h>
- union semun
- {
- int val;
- struct semid_ds *buf;
- unsigned short int *array;
- };
-
- int p(int semid,int index)
- {
- struct sembuf buf={0,-1,SEM_UNDO};
-
- if(index<0)
- {
- printf("error:index of the semaphore is invalid\n");
- exit(1);
- }
- buf.sem_num=index;
- if(semop(semid,&buf,1)==-1)
- {
- printf("P operation failed\n");
- exit(1);
- }
- return 0;
- }
-
- int v(int semid,int index)
- {
- struct sembuf buf={0,+1,SEM_UNDO};
-
- if(index<0)
- {
- printf("error:index of the semaphore is invalid\n");
- exit(1);
- }
- buf.sem_num=index;
- if(semop(semid,&buf,1)==-1)
- {
- printf("V operation failed\n");
- exit(1);
- }
- return 0;
- }
-
- int main(int argc,char** argv)
- {
- int proj_id;
- int semid;
- union semun arg;
- pid_t pid;
- key_t key;
- int num;
- int i,j;
-
- if(argc!=2)
- {
- printf("error:%s num\n",argv[0]);
- return -1;
- }
-
- num=atoi(argv[1]);
-
- //create key
- proj_id=2;
- if((key=ftok(".",proj_id))==-1)
- {
- printf("generating IPC key failed\n");
- return -1;
- }
-
- //create a semaphore set
- if((semid=semget(key,1,IPC_CREAT|0666))==-1)
- {
- printf("creating semaphore set failed\n");
- return -1;
- }
-
- if(semctl(semid,0,SETVAL,1)==-1)
- {
- printf("set semval failed\n");
- return -1;
- }
-
- for(i=0;i<num;i++)
- {
- pid=fork();
- if(pid<0)
- {
- printf("creating new process failed\n");
- return -1;
- }
- else if(pid==0)
- {
- if((semid=semget(key,1,0))==-1)
- {
- printf("geting semid failed in the child process\n");
- return -1;
- }
-
- p(semid,0);
- printf("===process %d enter the critical section===\n",getpid());
- sleep(1);
- printf("===process:%d is accessing=================\n",getpid());
- sleep(1);
- printf("===process %d leave the critical section===\n",getpid());
- sleep(1);
- v(semid,0);
-
- return -1;
- }
- }
-
- for(i=0;i<num;i++)
- {
- wait(NULL);
- }
-
- if(semctl(semid,0,IPC_RMID,0)==-1)
- {
- printf("remove the sem set failed\n");
- return -1;
- }
-
- return 0;
- }
作者: edsionte 发布时间: 2010-08-26
为什么“不是同一个临界区”?
作者: drangon 发布时间: 2010-08-26
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28