三个进程依次打印ABC.....

思路及大致流程如下:

思路取自这位大哥:

Linux编程题:创建3个线程分别打印abc,用信号量进行同步_cleverlemon的博客-CSDN博客

这位大哥写的是线程,不需要自己封装sem那些初始化函数,pv操作函数以及销毁函数,这篇写的是多进程,麻烦一些,大致思路一毛一样

来看代码实现:

先来对sem所需的初始化函数,pv操作函数,销毁函数进行封装:

sem.h

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys / sem. h>#define SEM_NUM 3
#define SEM1 0
#define SEM2 1
#define SEM3 2
union semun
{int val;
};
int sem_init( );
void sem_p( int index); //0,1,2因为有三个信号量  得对具体信号量进行操作
void sem_v(int index );
void sem destroy();

sem.c

#include "sem.h"static int semid = - 1;
int sem_init()
{semid = semget ( (key t)1234,SEM_NUM, IPC_CREAT|IPC_EXCL|0600);if ( semid == -1 ){semid = semget((key_t)1234,SEM_NUM,0600);if(semid == -1){    printf("semget err\n");return -1;}}else{int arr[SEM_NUM] = {1,0,0};for (int i = 0; i < SEM_NUM; i++){union semnu a;//给联合体起别名aa.val = arr[i];if (semctl(semid, i, SETVAL, a) == -1)  //semid是信号量集标识符  i是信号量集数组上的下标,表示某一个信号量  a是联合体的别名   SETVAL是命令对信号量赋值{ printf("semctl err\n");return -1;}}}
}
void sem_p( int index)
{if ( index < 0 || index >= SEM_NUM ) //下标越界直接终止程序{return;}struct sembuf buf;buf. sem_num = index;buf.sem_op = -1;// p操作buf.sem_flg = SEM_UNDO;  //防止获得信号量之后程序异常结束  SEM_UNDO的作用就是帮你把信号量释放if ( semop ( semid , &buf ,1)== -1 ){return :}}
void sem_v(int index)
{if ( index < 0 || index >= SEM_NUM ) //下标越界直接终止程序{return;}struct sembuf buf ;buf. sem_num = index;buf.sem_op = 1;// v操作buf.sem_flg = SEM_UNDO;if ( semop ( semid , &buf ,1)== -1 ) //这块semop(semid,&buf,1)中的1就是只定义了1个信号量buf,如果后面是3的话  前面那块就得写buf[3]{return :}
}
void sem_destroy()
{if(semctl(semid,0,IPC_RMID) == -1) //这块semctl(semid , 0 ,IPC_RMID)里面的参数,那个0激素个占位的作用  没什么实质性的作用  销毁的话 只需要semid和命令IPC_RMID就行了{return ;}
}

a.c的实现:

#include "sem. h"
int main()
{int res = sem_init();if (res == -1){return;}for (int i = 0; i < 5; i++) {sem_p(SEM1);printf("A"); //然后将该程序赋值三份  改一下pv操作中的参数  再给打印的A换成B/C fflush(stdout); sem_v(SEM2);}sem_destroy() :return 0;
}

b.c的实现:

#include "sem. h"
int main()
{int res = sem_init();if (res == -1){return;}for (int i = 0; i < 5; i++) {sem_p(SEM2);printf("B"); //然后将该程序赋值三份  改一下pv操作中的参数  再给打印的A换成B/C fflush(stdout); sem_v(SEM3);}sem_destroy():return 0;
}

c.c的实现:

#include "sem. h"
int main()
{int res = sem_init();if (res == -1){return;}for (int i = 0; i < 5; i++) {sem_p(SEM3);printf("C"); //然后将该程序赋值三份  改一下pv操作中的参数  再给打印的A换成B/C fflush(stdout); sem_v(SEM1);}sem_destroy():return 0;
}

所有代码搞定  来看执行

对所有程序进行编译链接:

 运行结果:

我编译链接的时候semid给错了  所以打印出来就变成了CBA  其实思想一样的,依次打印就好了  我就懒得改了!

“只有学习才可以让生活变得充实起来!”

Linux编程题:信号量同步三进程依次打印若干次ABC相关推荐

  1. linux结束打印机进程,Linux系统,如何知道哪个进程在打印log?

    Linux系统,如何知道哪个进程在打印log? 关注:155  答案:2  mip版 解决时间 2021-02-07 10:18 提问者彼岸独舞 2021-02-06 23:42 调试嵌入式机器的时候 ...

  2. linux c 网络编程与信号量,详解Linux多线程使用信号量同步

    信号量.同步这些名词在进程间通信时就已经说过,在这里它们的意思是相同的,只不过是同步的对象不同而已.但是下面介绍的信号量的接口是用于线程的信号量,注意不要跟用于进程间通信的信号量混淆. 一.什么是信号 ...

  3. Linux多线程——使用信号量同步线程

    http://blog.csdn.net/ljianhui/article/details/10813469/ 信号量.同步这些名词在进程间通信时就已经说过,在这里它们的意思是相同的,只不过是同步的对 ...

  4. java 打印一棵树_java编程题之从上往下打印出二叉树

    本文实例为大家分享了java从上往下打印出二叉树的具体代码,供大家参考,具体内容如下 import java.util.ArrayList; import java.util.Stack; /** * ...

  5. linux编程课后作业,Unix/Linux 编程实践教程第三章习题

    tips: 答案仅供参考,不保证正确* 3.1 在我的 deepin 上,d_name 的长度是 256,有的系统定义成 1 是为了节省空间,使用时可以通过 malloc() 动态的分配空间,比如: ...

  6. 中国大学(慕课)哈工大C语言程序设计精髓编程题在线测试第三周

    1 学分绩计算 题目内容: 已知某大学期末考试学分绩的计算公式为:学分绩 =(工科数学 * 5 + 英语 * 1.5 + 线性代数 * 3.5) / 10请编程从键盘按顺序输入某学生的工科数学.英语和 ...

  7. 详解C语言编程题:任意三条边能否构成三角形,输出该三角形面积并判断其类型

    问题:根据输入的三角形的三边判断是否能组成三角形,若可以,则输出它的面积并判断该三角形的类型. 思路: 1.判断三边是否能组成三角形:任意两边之和大于第三边.任意两边之差小于第三边.(这里以前者举例) ...

  8. 2021 华南农业大学Linux编程题

    1.编写⼀段shell程序实现以下功能: 根据键盘输⼊的学⽣成绩,显示相应的成绩等级, 其中 60分以下为"Failed!", 60~69分为"Passed!" ...

  9. Linux环境编程姜林美,Linux环境编程习题_编程题_答案.pdf

    Linux环境编程习题_编程题_答案 Linux 境编程-人民邮电出版社-姜林美 课后习题(编程题)答案 第三章 1 第五章 4 第六章 9 第七章 19 第八章 22 第九章 35 第十章 38 三 ...

最新文章

  1. 渗透知识-SSRF漏洞
  2. 【路由交换实验】VLAN
  3. HDU 2055 An easy problem
  4. B1928 日期差值
  5. 如何向前一个Fragment回传信息?
  6. h.264保存flv文件
  7. js双击事件条件触发_js页面触发chargeRequest事件和Nginx获取日志信息
  8. 产品沉思录 V3.0 试读
  9. 恒定湿热试验条件及标准-环境试验中的湿热试验报告
  10. TMS320F28335的SPI
  11. jQuery动画高级用法(上)——详解animation中的.queue()函数 http://www.cnblogs.com/hh54188/archive/2011/04/09/1996469.
  12. Windows 10内置Hyper-V虚拟机安装XP系统(二) - 配置网络
  13. 计算机里折叠项无法删除,删除右键多余菜单_如何去除右键菜单中多余选项?...
  14. ip地址、DNS服务器、子网掩码、默认网关之间关系
  15. cdh6.3安装以及整合spark2、flink1.9
  16. 【MQTT从入门到提高系列 | 06】MQTT3.1.1之SUBSCRIBE订阅工作流
  17. 十分钟入门Visio,不行来砍我!
  18. App 后台架构设计方案 设计思想与最佳实践
  19. ue4 后期处理景深_Unreal Engine4 后期处理特效 VOL1
  20. 沐神《动手学深度实战Kaggle比赛:狗的品种识别(ImageNet Dogs)

热门文章

  1. 如何在框架外部自定义C++ OP
  2. 华为热设计工程师待遇_华为给985毕业生开2万元的工资,是侮辱价?还是不自量力?...
  3. Android Handler sendEmptyMessageDelayed 和 sendEmptyMessage 的使用
  4. shell case
  5. 2022-2028年中国除螨仪行业市场前瞻与投资战略规划分析报告
  6. Redis 入门知识
  7. C#_Socket网络编程实现的简单局域网内即时聊天,发送文件,抖动窗口。
  8. Jetty Cross Origin Filter解决jQuery Ajax跨域访问的方法
  9. 关于SpringMVC和Struts2的区别
  10. c# 垃圾回收是引用类型而言的