当前位置: 首页 > news >正文

学习记录第二十七天

信号量

        在Linux C语言中,信号量是一种用于实现进程或线程同步的机制。它可以帮助控制对共享资源的访问,防止数据竞争和不一致性。信号量通常具有两个基本操作:P(proberen,尝试)和V(verhogen,增加)。P操作会尝试减少信号量的值,如果信号量的值大于零,则操作成功,否则进程或线程会被阻塞。V操作则会增加信号量的值,并可能唤醒等待该信号量的进程或线程

POSIX信号量

        POSIX信号量提供了一套标准的信号量操作接口,包括sem_init、sem_wait、sem_post和sem_destroy等函数。这些函数声明在<semaphore.h>头文件中。
  1.sem_init函数用于初始化信号量,设置其值和共享属性。
  2.sem_wait函数用于等待信号量,如果信号量的值大于0,则将其减1并返回,否则阻塞当前线程。
  3.sem_post函数用于释放信号量,将信号量的值加1,可能唤醒等待的线程。
  4.sem_destroy函数用于销毁信号量,释放与其关联的资源。
注意事项
  1.在使用信号量时,应该确保正确初始化和销毁信号量,以避免资源泄露。
  2.信号量的操作必须是原子的,以保证同步的正确性。
  3.在多线程环境中,信号量通常用于保护共享资源,防止多个线程同时修改这些资源。

管道(Pipe)

        管道是一种在Unix和类Unix操作系统中用于进程间通信(IPC)的机制,它允许数据从一个进程(或线程)流向另一个进程(或线程)。管道可以分为两种主要类型:无名管道和有名管道(FIFO)。

无名管道

         无名管道是用于具有亲缘关系的进程(如父进程和子进程)之间的通信。当一个进程通过fork()函数创建一个子进程后,可以使用pipe()函数创建一个无名管道,然后通过读写端的文件描述符进行数据交换。无名管道在文件系统中没有对应的文件名,因此它们是匿名的,只在创建它们的进程之间可见。

有名管道(FIFO)

        有名管道,或称为FIFO(First In First Out),是一种持久的管道,它们在文件系统中表现为特殊文件,因此可以被任何有权访问的进程使用,而不局限于具有亲缘关系的进程。有名管道可以跨越进程的创建和销毁,即使创建它们的进程终止后,这些管道仍然存在,直到被系统或管理员明确删除。

管道的工作原理

        管道内部是一个先进先出的缓冲区,数据只能单向流动。通常一个进程负责写入数据(写端),另一个进程负责读取数据(读端)。数据的发送者通过向管道的写端写入数据,接收者通过从管道的读端读取数据。当数据写入管道的缓冲区满时,写端将被阻塞直到有空间可用;同样,当数据读取完毕,读端将阻塞直到有新的数据写入。

无名管道的概念和特点

        无名管道是一种进程间通信机制,它允许有亲缘关系的进程之间通过一个共享的缓冲区进行数据交换。这种管道在创建时不在文件系统中显示,它的生命周期与创建它的进程相同。无名管道的特点包括:
  1.亲缘关系:只有创建它的父进程及其子进程可以使用无名管道进行通信。
  2.共享缓冲区:父子进程通过读写两端的文件描述符访问同一个缓冲区。
  3.非持久化:一旦创建它的进程结束,无名管道就不再存在。

无名管道的创建和使用方法

        无名管道的创建使用pipe()系统调用。这个调用创建一个管道,并返回两个文件描述符,一个用于读取(读端),另一个用于写入(写端)。创建后,父进程的标准输出文件描述符通常会被重定向到管道的写端,而子进程的标准输入文件描述符会被重定向到管道的读端。这样,父进程和子进程可以通过标准输入输出进行通信。

pipe()函数原型

pipe()函数用于创建一个无名管道,该函数的原型定义在unistd.h头文件中,如下所示:

#include <unistd.h>
int pipe(int pipefd[2]);

        这里的pipefd是一个整数数组,用来存放由pipe()函数返回的两个文件描述符。pipefd[0]表示管道的读端,而pipefd[1]表示管道的写端。

pipe()函数使用方法

使用pipe()函数创建管道的一般步骤如下:
  1.包含必要的头文件<unistd.h>。
  2.声明一个整数数组来存放文件描述符。
  3.调用pipe()函数,并检查返回值以确认管道是否成功创建。
  4.使用返回的文件描述符进行读写操作。

注意事项

  1.在使用无名管道时,需要确保正确管理文件描述符,避免资源泄漏。
  2.由于管道的容量有限,需要处理可能出现的溢出情况。
  3.在多进程环境中,应考虑同步机制以避免数据竞争。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • XSS-跨站脚本攻击
  • uniapp中键盘抬起挤压界面
  • 笔记本一线品牌有哪些
  • VBA技术资料MF184:图片导入Word添加说明文字设置格式
  • Java TCP练习2
  • 文件上传-导引
  • P2858 [USACO06FEB] Treats for the Cows
  • WordPress建站之头像及字体错误修正
  • Git 常用命令与工作流程总结
  • 域自适应,你适应了嘛?
  • 快讯 | OpenAI 找回场子:chatgpt-4o-latest 刷新多项AI跑分纪录
  • 1.Linux_常识
  • Anaconda安装jupyter notebook、jupyterlab及体验
  • 如何快速掌握一款MCU
  • selenium爬取搜狗网站新闻的小Demo
  • [译]CSS 居中(Center)方法大合集
  • JavaScript对象详解
  • Linux Process Manage
  • React+TypeScript入门
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 理清楚Vue的结构
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 手机端车牌号码键盘的vue组件
  • 数据结构java版之冒泡排序及优化
  • 算法-插入排序
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • python最赚钱的4个方向,你最心动的是哪个?
  • 仓管云——企业云erp功能有哪些?
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • ‌U盘闪一下就没了?‌如何有效恢复数据
  • (1)SpringCloud 整合Python
  • (2)Java 简介
  • (3)选择元素——(17)练习(Exercises)
  • (第27天)Oracle 数据泵转换分区表
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (附源码)计算机毕业设计大学生兼职系统
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (详细文档!)javaswing图书管理系统+mysql数据库
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)详解PHP处理密码的几种方式
  • (转)项目管理杂谈-我所期望的新人
  • **python多态
  • .NET 5种线程安全集合
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .net core Redis 使用有序集合实现延迟队列
  • .NET DataGridView数据绑定说明
  • .Net mvc总结