【Linux】进程通信 | 共享内存 | 信号量
上篇Linux的博客是有关管道的,今日就让我们继续康康进程间通信的另外一种方法:共享内存 完整代码详见我的gitee仓库...
【Linux】进程通信 | 管道
今天让我们来认识如何使用管道来进行进程间通信 [TOC] 1.何为管道?在最初学习linux的基础命令时,接触过用|来连接多个命令的操作。当时便提到了这是一个管道操作,但没有详解管道到底是什么。 1.1 管道是进程间通信的一种方式管道管道,如同其名,是一个可以让数据在内部流动的东西。创建管道,就好比在两个阀门(进程)之间搭了一根水管,我们可以自由控制管道中水的流向 不过,在Linux系统中提供的管道接口,只支持单项流动。一个管道只支持从A->B,不支持B->A 要想进行双向通信,则需要创建两个管道 1.2 进程通信既然管道是用来进程通信的,那进程通信又是什么,它有何用呢? 进程通信的目的是让两个进程可以相互交流,包括以下几种情况: 数据传输,从进程A发送数据道进程B 资源共享,多个进程使用同一个资源 通知事件,进程A向进程B发送消息,告知进程B发生了什么事件 进程控制,父进程通过管道来控制子进程的执行,进程A控制进程B的执行等等 除了管道,我们还可以通过systemV/POSIX来实现进程通信 进程通信的核心思想:让两个进程获取到同一份资源 1.3...
【Linux】动静态库
在最初学习GCC的使用的时候,提到了动态、静态库的创建办法。今天就让我们来详细了解一番,它们之间究竟有何不同吧! 演示所用系统:centos7.6 [TOC] 1.动态库和静态库先来了解一下动态库和静态库的基本概念吧! 静态库.a 程序编译链接的时候,把静态库的代码连接到自己的可执行程序中,程序运行的时候将不再需要静态库 动态库.so 程序在运行的时候才去链接动态库的代码,多个程序共享库的代码 2.生成 测试所用代码 👉 点我 我写好了两个头文件和两个源文件,为了减少博客篇幅,此处只贴出.c的函数实现 12345678910111213//myMath.c#include"myMath.h"int Add(int a,int b){ return a+b;}//myPrint.c#include "myPrint.h"void Print(const char* msg){ printf("time: %d, msg: %s\n",(unsigned...
【Linux】文件IO
让我们来认识一下linux下的文件接口吧! 演示所用系统:CentOS7.6 本文所有代码都可以在我的gitee仓库查看【链接】 [TOC] 1.什么是文件? 文件=文件内容+文件属性,文件属性也是数据,即便我们创建一个空文件,也是会占用磁盘空间的 文件操作=文件内容的操作+文件属性的操作,在之前linux权限的博客里面就提到过,文件操作有可能即改变内容,又改变属性 文件打开操作其实是把文件的属性和内容加载到内存中,没有被打开的文件依旧处于磁盘当中 当前路径为当前进程所处的工作路径 我们的打开文件操作需要和磁盘这个硬件打交道,只有操作系统才能直接操作硬件。所以我们的文件操作其实都是调用的系统接口。 实际上,所有编程语言都对操作系统接口进行了封装,这样才能保证他们的跨平台性。因为不同操作系统的各种接口各不相同,如果不进行封装,直接调用系统接口,则该代码只能在指定系统上跑! 1.2 C语言文件操作在学习Linux下文件相关内容之前,我们先来复习一下C语言的文件接口 12345678910111213141516171819202122232425262728void...
【C++】文件IO流
一起来康康C++中的文件IO操作吧 [TOC] 1.operator bool之前写OJ的时候,就已经用过上面这种方式来获取多组测试用例 12345string s;while(cin>>s){ cout << s << endl;} 不过之前一直没有去了解这里的底层原理是什么,借此机会一并说明 io流可以进行while判断的依据,是因为库的源码中重载了operator bool 没错,operator不仅可以重载一个操作符,它还可以重载一个类型!即将这个类转换为bool类型,return 一个bool类型的值用于while的判断 同理,重载int/double这些类型都是可行的! 另外,要想停止上面的多组输入,在VS下可以用ctrl+z的方式解决,而不要用ctrl+c直接杀掉进程 2.C++文件IO流 C++的文件io类设计的较为复杂,其中还出现了菱形继承,也就是我们最常用的iostream 上面提到的operator...
【C++】类型转换方法
本篇博客让我们来见识一下C++中新增的类型转换方法 [TOC] 1.C语言中类型转换在C语言中,类型转换有下面两种形式 隐式类型转换 显示强制类型转换int a=(int)'c' 这两种方式想必各位都很熟悉了,但隐式类型转换在一些场景里面会出现问题 123456789void insert(size_t pos,char c){ int...
【C++】特殊类设计 | 单例模式
本篇博客让我们来康康一些特殊类的实现方式! 1.不支持拷贝的类在一些场景下,比如智能指针、多线程操作、IO流等是不支持拷贝的。因为它们的拷贝会导致一些问题,秉着解决不了问题,就解决提出问题的人的思路,禁止了这些类的拷贝 C++98中,可以将拷贝构造和=重载只声明不定义,并将其访问权限设置为私有 设置为私有可以防止其他人在类外定义 C++11中,提供了一个特殊的关键字delete来禁止实现拷贝构造和 =重载 12345678910111213141516171819202122// 禁止拷贝的类class BanCopy{public: //构造 BanCopy() { _a = _b = 0; } //C++11 BanCopy(const BanCopy& c) = delete; BanCopy& operator=(const BanCopy& c) = delete;private: //C++98的办法,声明为私有且不定义 //BanCopy(const BanCopy&...
【C++】空间配置器
空间配置器,听起来高大上,那它到底是什么东西呢? 1.什么是空间配置器?空间配置器是STL源码中实现的一个小灶,用来应对STL容器频繁申请小块内存空间的问题。他算是一个小型的内存池,以提升STL容器在空间申请方面的效率 2.了解空间配置器STL以128个字节为分界线,将空间配置器分为了一级和二级 2.1 一级一级空间配置器中,allocate/deallocate函数实际上就是对malloc/free做了一个简单的封装 123456789101112131415161718192021222324252627static void * allocate(size_t n){ void *result = malloc(n); if (0 == result) result = oom_malloc(n); return result;}static void deallocate(void *p, size_t /* n */){ ...
【Linux】简易shell的实现
本篇博客,来教大家用C写一个简易的linux shell,帮助理解之前学习的进程控制相关知识 演示系统:CentOS7.6 [TOC] 前言之所以说是简易的shell,是因为我们现在的水平肯定写不出来linux系统里面那么复杂的shell。 我们的目的仅仅是为了学习父子进程、进程替换、内建命令等等知识,并把这些知识的作用通过这个小shell体现出来 源码仓库:gitee 1.基础框架之前的学习中有提到过,我们在linux命令行内运行的很多进程,都是以子进程的方式运行的。说白了就是bash进程里面给我们fork创建了其他子进程,再用子进程进行进程替换,指向对应的可执行文件 而需要做到这一点,我们要一步一步来 bash首先要显示命令行的提示符用户名@主机名 路径(参考之前vim博客中的进度条程序) 获取用户的输入内容 从用户的输入中,以" "空格为分割,分离出命令和参数 fork创建子进程,子进程执行进程替换,父进程等待子进程结束 这一切都是在一个while(1)的死循环里面执行的,bash本质上就是一个死循环的父进程 2.开整一个2.1...
【Linux】进程控制
阿巴阿巴,进程概念结束了,现在该学习如何控制一个进程了 所用系统:CentOS 7.6 [TOC] 1.进程创建1.1 fork关于linux下的进程创建其实我们已经接触过了,那便是使用fork函数来进行操作 1pid_t ret = fork(); fork的返回值:子进程返回0、父进程返回子进程pid;出错返回-1 小tips,其实pid_t就是int类型! 1typedef __pid_t...