首页 > 系统相关 >嵌入式学习---DAY27:信号量、进程间的通信

嵌入式学习---DAY27:信号量、进程间的通信

时间:2024-08-16 19:51:56浏览次数:16  
标签:信号量 int DAY27 bufr --- 管道 sem 资源

一、信号量

信号量(semaphore)是操作系统用来解决并发中的互斥和同步问题的一种方法。

信号量 (个数) --- 反映的是资源的数量

信号量的分类:信号无名量 ==》线程间通信

                         有名信号量 ==》进程间通信

1.信号量的定义 (为全局变量)

sem_t  sem

sem_t:信号量的类型,sem:信号量的变量

例如: sem_t sem_w;,sem_t sem_r;


sem_t sem_1;
sem_t sem_2;

2.信号量的初始化

int sem_init(sem_t *sem, int pshared, unsigned int value);

功能:将已经定义好的信号量赋值。

参数:sem 要初始化的信号量,pshared = 0 ;表示线程间使用信号量,!=0 ;表示进程间使用信号量,value 信号量的初始值,一般无名信号量都是二值信号量(0 1) ,0 表示红灯,进程暂停阻塞,1 表示绿灯,进程可以通过执行

返回值:成功  0,失败  -1;

sem_init(&sem_1,0,1);
sem_init(&sem_2,0,0);

3.信号量的PV操作

sem_wait()/ sem_post()

 P ===》申请资源===》申请一个二值信号量int sem_wait(sem_t *sem); 
功能:判断当前sem信号量是否有资源可用。如果sem有资源(==1),则申请该资源,程序继续运行如果sem没有资源(==0),则线程阻塞等待,一旦有资源则自动申请资源并继续运行程序。

注意:sem 申请资源后会自动执行 sem = sem - 1;

参数:sem 要判断的信号量资源

返回值:成功 0 ,失败 -1

 V ===》释放资源===》释放一个二值信号量,nt sem_post(sem_t *sem); 

功能:函数可以将指定的sem信号量资源释放并默认执行,sem = sem+1; 线程在该函数上不会阻塞。

参数:sem 要释放资源的信号量

返回值:成功 0, 失败 -1;

void *doWin2(void *arg)
{
	int i = 0;
	while (1)
	{
		sem_wait(&sem_2);
		if (ticket <= 0)
		{
			sem_post(&sem_1);
			break;
		}
		ticket--; //1 => 0
		printf("win2 sell ticket = %d\n",100-ticket); //100 
		sem_post(&sem_1);
	}

	pthread_exit(NULL);
}

4.信号量的销毁

 int sem_destroy(sem_t *sem);

功能:使用完毕将指定的信号量销毁

参数:sem要销毁的信号量

返回值:成功 0,失败  -1;

sem_destroy(&sem_1);
sem_destroy(&sem_2);

二、进程间的通信 

进程创建好之后,父子进程的空间 相互独立 。

1.通信的方式

1、古老的通信方式

管道:无名管道    (1),有名管道    (2)

信号  (3)

2、IPC对象通信 system v    BSD     suse fedora   kernel.org

                          消息队列  (4)

                           共享内存(*) //最高效                (5)

                          信号量集() //信号量                 (6)

3、socket通信

网络通信        (7)

2.管道:  无名管道 

1.int pipe(int pipefd[2]);  

功能:创建一个管道 

参数:pipefd //用来获取 管道的两端 ,读端pipefd[0] ,写端pipefd[1]

返回值:成功 0,失败 -1 && errno  

#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main(int argc, const char *argv[])
{
	int fd[2];

	if (pipe(fd) < 0)
	{
		perror("pipe fail");
		return -1;
	}
	char buf[] = "hello pipe\n";
	write(fd[1],buf,strlen(buf));
    char bufr[100] = {0};
	read(fd[0],bufr,sizeof(bufr));
	printf("bufr = %s\n",bufr);
	return 0;
}

2.管道的特点

管道大小 65536字节   64k 

管道操作特点 ,数据读走之后,认为就没了 

3.管道的读写规则

1.读端存在,写管道

      管道空:可以写数据

      管道满:会造成-->写阻塞 

2.读端不存在,写管道

      系统会给进程发一个信号SIGPIPE(管道破裂)

3.写端存在,读管道

      管道空,读不到数据,

      这时会造成读操作阻塞

4.写端不存在,读管道 

     如果管道中有数据,则读取这些数据!

     如果没有数据,读操作不阻塞,立即返回!

标签:信号量,int,DAY27,bufr,---,管道,sem,资源
From: https://blog.csdn.net/2301_78040391/article/details/141267899

相关文章

  • 26-Prism和SPSS的显著性分析
      使用prism计算相关性,并绘制柱形图:示例:有4组数据,每组都有4个样本,这种单变量的多组数据之间的比较适用One-wayANOVA检验。若是双变量的多组数据则适用于TWO-wayANOVA检验。若是只有两组,适用于t-test检验。Grouplength1341321311312482......
  • Note - 树分治(点分治、点分树)
    陈年笔记,现在可能不会了。点分治Q1:基本思想是什么?将路径分为经过\(u\)和不经过\(u\)的两类,在每次分治中计算经过\(u\)的路径数量。Q2:如何统计?一般:遍历\(u\)的每个子节点\(v\),把\(v\)子树内的节点记录下来,得到答案并更新数组。容斥:把\(u\)子树内的节点都记录下......
  • Note - 高斯消元法(证明略)
    线性代数高斯消元法求解线性方程组高斯消元法是求解线性方程组的经典算法,还可以用于行列式计算、求矩阵的逆。部分代码From「SDOI2006」线性方程组doublea[N][N];//a[i][j]表示第i个方程中第j个元的系数,a[i][n+1]为等号右侧的常数项voidGauss(){for(inti=1;i<......
  • centos(linux): rpm -V 验证rpm包安装程序的安全
    一,作用rpm-Va:校验所有的RPM软件包,通常用来检查系统文件是否被植入后门或rootkit二,例子#-V:校验软件包,此校验功能可以用来确认文件是否被修改或覆盖#-a: RPM校验系统中所有已安装的软件包[root@blog~]#rpm-Va>rpmva.txt返回结果:[root@blog~]#morerpmva.tx......
  • 基于flask+vue框架的的校园后台报修管理系统设计与实现[开题+论文+程序]-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着校园信息化建设的不断深入,各类基础设施的维护与保养成为保障教学、科研及师生生活顺利进行的重要环节。然而,传统的报修方式往往依赖于......
  • 基于flask+vue框架的基于Android的大学校园车辆管理系统统后[开题+论文+程序]-计算机
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着大学校园规模的不断扩大与师生数量的激增,校园内的车辆管理问题日益凸显。传统的人工管理方式不仅效率低下,难以满足高峰时段的车辆进出......
  • 基于flask+vue框架的高校日常办公管理系统设计与实现[开题+论文+程序]-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着高校规模的不断扩大与教育信息化的深入发展,高校日常办公管理面临着前所未有的挑战。传统的手工或半自动化管理方式已难以满足日益增长......
  • 基于flask+vue框架的大学生成绩管理系统[开题+论文+程序]-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着高等教育的普及与信息化技术的飞速发展,大学生成绩管理成为高校教务管理中至关重要的一环。传统的手工成绩记录与管理方式不仅效率低下......
  • C语言学习 --- 冒泡排序与二分查找
    冒泡排序 排序        从小到大顺序排 轮数        数据个数-1 每一次比较的次数      数据个数-1-当前的轮数      每次比较开始从下标为0的地方开始比较     轮数:0~<数据个数-1次数:0~<数......
  • 博客园-awescnb插件-geek皮肤优化
    简介本文介绍博客园在使用awescnb插件中的geek皮肤时的一些相关优化,主要涉及博客园统计(blogStats)展示及自定义日历隐藏。皮肤安装博客园自定义皮肤工具推荐:awescnb博客效果优化1.隐藏右上角自定义日志展示直接通过更改css样式隐藏具体操作:博客园->管理->设置->......