1://假设两个进程(父子进程)对一个文件进行写操作,但是这个文件同一时间只能有一个进程进行写操作。

2://利用信号量实现pv操作

3:#include

4:#include

5:#include

6:#include

7:#include

8:#include

9:struct sembuf sops;

10:static int sid;

11://创建一个新的信号量集

12:int createSemset(void)

13:{

14:char* pathname="semset";

15:if( access(pathname, F_OK)!=0 )

16:{

17:int fd=open(pathname, O_RDWR | O_CREAT, 0666);

18:if( fd<0 )

19:{

20:perror("open");

21:return -1;

22:}

23:}

24:key_t key=ftok(pathname, 'a');

25:if( -1==key )

26:{

27:perror("ftok");

28:return -1;

29:}

30:return semget(key, 1, IPC_CREAT | 0666) ;

31:}

32:

33://P操作

34:int P(void)

35:{

36:sops.sem_num=0;

37:sops.sem_op=-1;

38:sops.sem_flg=0;

39:return semop(sid, &sops, 1);

40:}

41://V操作

42:int V(void)

43:{

44:sops.sem_num=0;

45:sops.sem_op=1;

46:sops.sem_flg=0;

47:return semop(sid, &sops, 1);

48:}

49:int main(int argc, char *argv[])

50:{

51:sid=createSemset();

52:if( -1==sid )

53:{

54:perror("createSemset");

55:exit(1);

56:}

57:

58:if( -1==semctl(sid, 0, SETVAL, 1) )

59:{

60:perror("SETVAL");

61:exit(1);

62:}

63:pid_t pid=fork();

64:if( pid<0 )

65:{

66:perror("fork");

67:exit(1);

68:}

69:else if( 0==pid )

70:{

71:while(1)

72:{

73:if( -1==P() )

74:{

75:printf("P操作失败!

");

76:exit(1);

77:}

78:printf("子进程正在对文件进行写操作!

");

79:sleep(1);

80:printf("子进程写操作完毕,释放资源!

");

81:if( -1==V() )

82:{

83:printf("V操作失败!");

84:exit(1);

85:}

86:}

87:}

88:else

89:{

90:while(1)

91:{

92:if( -1==P() )

93:{

94:printf("P操作失败!

");

95:exit(1);

96:}

97:printf("父进程进程正在对文件进行写操作!

");

98:sleep(1);

99:printf("父进程写操作完毕,释放资源!

");

100:if( -1==V() )

101:{

102:printf("V操作失败!");

103:exit(1);

104:} ......

1:void P(int semid)

2:{

3: struct sembuf sem_p;

4: sem_p.sem_num = 0;

5: sem_p.sem_op = -1;

6: sem_p.sem_flg = SEM_UNDO;

7: if (semop(semid, &sem_p, 1) == -1) {

8: perror("p op failed

");

9: exit(1);

10: }

11:}

12:

13:void V(int semid)

14:{

15: struct sembuf sem_p;

16: sem_p.sem_num = 0;

17: sem_p.sem_op = 1;

18: sem_p.sem_flg = SEM_UNDO;

19: if (semop(semid, &sem_p, 1) == -1) {

20: perror("v op failed

");

21: exit(1);

22: }

23:}

PV原语通过操作信号量来处理进程间的同步与互斥的问题。其核心就是一段不可分割不可中断的程序。

信号量的概念1965年由著名的荷兰计算机科学家Dijkstra提出,其基本思路是用一种新的变量类型(semaphore)来记录当前可用资源的数量。有两种实现方式:1)semaphore的取值必须大于或等于0。0表示当前已没有空闲资源,而正数表示当前空闲资源的数量;2) semaphore的取值可正可负,负数的绝对值表示正在等待进入临界区的进程个数。

信号量是由操作系统来维护的,用户进程只能通过初始化和两个标准原语(P、V原语)来访问。初始化可指定一个非负整数,即空闲资源总数。

P原语:P是荷兰语Proberen(测试)的首字母。为阻塞原语,负责把当前进程由运行状态转换为阻塞状态,直到另外一个进程唤醒它。操作为:申请一个空闲资源(把信号量减1),若成功,则退出;若失败,则该进程被阻塞;

V原语:V是荷兰语Verhogen(增加)的首字母。为唤醒原语,负责把一个被阻塞的进程唤醒,它有一个参数表,存放着等待被唤醒的进程信息。操作为:释放一个被占用的资源(把信号量加1),如果发现有被阻塞的进程,则选择一个唤醒之。

具体PV原语对信号量的操作可以分为三种情况:

1)把信号量视为一个加锁标志位,实现对一个共享变量的互斥访问。

实现过程:

P(mutex); // mutex的初始值为1 访问该共享数据;

V(mutex);

非临界区

2)把信号量视为是某种类型的共享资源的剩余个数,实现对一类共享资源的访问。

实现过程:

P(resource); // resource的初始值为该资源的个数N 使用该资源;

V(resource); 非临界区

3)把信号量作为进程间的同步工具

实现过程:

临界区C1;

P(S);

V(S);

临界区C2;

linux pv 信号量,Linux信号量PV操作相关推荐

  1. 信号量机制与PV操作的理解

    目录 基本概念 PV操作处理相关问题 正确理解信号量机制 基本概念 信号量机制是一种有效的进程同步和互斥工具.信号量有整形信号量.记录型信号量.二进制信号量等.常用整型信号量实现PV操作.P操作表示申 ...

  2. 信号量机制(PV操作)

    信号量机制处理互斥关系: PV操作可以有效地实现对临界区的管理 设置一个公共信号量s,同时提供两个基于该信号量上的原语操作:P(s).V(s) 代码实现过程: P(s) //检测锁状态并上锁 {s-- ...

  3. 进程同步之信号量机制(pv操作)及三个经典同步问题

    上篇博客中(进程同步之临界区域问题及Peterson算法),我们对临界区,临界资源,锁机制详细解读了下,留下了一个问题,就是锁机制只能判断临界资源是否被占用,所以他解决了互斥问题,但是他不能确定前面的 ...

  4. 进程同步之信号量机制(pv操作)

    1.信号量机制 信号量机制即利用pv操作来对信号量进行处理. 什么是信号量?信号量(semaphore)的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程.信号量的值与相应资源的使用情况有 ...

  5. linux进程间通信:POSIX信号量

    文章目录 概念描述 编程接口 注意事项 编程案例 信号量基本接口使用案例 信号量父子进程间通信 信号量实现 两进程之间通信 概念描述 英文:semaphore 简称SEM,主要用来进行进程间同步 本质 ...

  6. Linux 学习笔记16 信号量

    Linux 学习笔记16 信号量Semaphore 信号量概念 信号量(或信号灯)是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语. 信号量是控制进程(或线程)同步(谁先执行,谁后执行 ...

  7. linux下清理信号量,Linux下进程间通信方式——信号量(Semaphore)

    1.信号量 信号量本质上是一个计数器(不设置全局变量是因为进程间是相互独立的,而这不一定能看到,看到也不能保证++引用计数为原子操作),用于多进程对共享数据对象的读取,它和管道有所不同,它不以传送数据 ...

  8. Linux IPC 3 之 信号量

    一 什么是信号量 二 信号量的分类 三 内核信号量 1 内核信号量的构成 2 内核信号量中的等待队列删除没有联系 3 内核信号量的相关函数 1 初始化 2 申请内核信号量所保护的资源 3 释放内核信号 ...

  9. linux 获取和释放信号量_学习Linux(39)信号量

    进程信号量基本概念 信号量与已经介绍过的 管道.FIFO以及消息列队不同,它本质上是一个计数器,用于多进程间对共享数据对象的读取,它和管道有所不同,它不以传送数据为主要目的,它主要是用来保护共享资源( ...

最新文章

  1. 创业互联网公司如何搭建自己的技术框架
  2. luogu P1393 P3157 动态逆序对
  3. PS基础教程[3]如何去除照片上的水印
  4. linux 线程pthread_detach,linux线程之pthread_join和pthread_detach
  5. 3种Java工厂模式深入理解分析
  6. 重塑APM标杆,博睿数据战略升级助力企业数字化转型
  7. Python中break和continue语句及循环中的else子句
  8. 【转】NB-IoT移远BC95使用小结
  9. MQL5中的错误处理和日志记录
  10. 基于FCM算法的聚类算法
  11. xml--json代码大全
  12. 【数学】连续,一致连续,Hölder连续,Lipschitz连续
  13. 腾讯互娱开源分布式开发框架Pebble
  14. 相机标定中的相机焦距
  15. 使用 Python 全栈打造淘宝客微信机器人
  16. Linux虚拟机安装及Docker常用操作
  17. Python-python程序打包为独立的EXE文件,并配上自定义的图标
  18. 生成二维码API接口,免费好用
  19. 使用云服务器和物理机的区别是什么
  20. SAP HR 常用函数*持续更新中...

热门文章

  1. python爬取妹子图片_利用爬虫爬取清纯妹子图片
  2. 交易所交易规则--股票分红
  3. uni-app使用阿里巴巴图标库icon详细步骤--避免踩坑
  4. dev c++乱码问题的解决
  5. JS日历控件不显示2021年问题, 不显示2021年以后的年份,怎么解决?
  6. 再会,Unite 2017 Shanghai
  7. 爬取网贷之家平台数据保存到mysql数据库
  8. Prettier介绍与基本用法
  9. 帕瓦新能源递交注册:拟募资15亿 研发投入占比低于5%
  10. flutter项目架构