自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(77)
  • 收藏
  • 关注

原创 进程间通信(IPC)

进程间具有独立性(每个进程都有自己的一份独立的虚拟地址空间,一个进程只能访问自己的虚拟地址空间,但不包括内核空间,不能访问其他进程的),如果多进程之间想相互通信,此时无法直接进行(一个进程不能读取其他进程的虚拟地址空间中的内容,更不能去修改),因此需要操作系统提供一些公共资源(内存、文件等)来让多个进程都能通过访问这个媒介进行通信。2、System V IPC:一套较古老的标准。3、POSIX IPC:一套跨平台的新标准。操作系统为用户提供的几种进程间的通信方式。1、管道:最古老的通信形式。

2024-03-15 14:45:21 366

原创 数组名及数组传参问题

数组名#include<stdio.h>int main(){#if 0 int a[5] = {1,2,3,4,5}; printf("%d\n", sizeof(a));//20,a代表整个数组 printf("%d\n", sizeof(&a));//4,&a只是个(指向整个一维数组的)指针常量,在32位操作系统下,占4字节 printf("%d...

2019-09-07 14:45:37 572

原创

树:非线性结构(结点间前驱、后继的关系并不具有惟一性),其结点间的关系是前驱惟一,而后继不惟一,即结点之间是一对多的关系。

2019-09-06 08:32:41 1859

原创 用 System V IPC 共享内存实现简单的 Client&Server 通信

占用。

2024-05-16 15:14:45 278

原创 System V IPC 共享内存

共享内存是最快的进程间通信方式,一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说,进程不再通过执行进入内核的系统调用来传递彼此的数据。

2024-05-14 17:13:40 212

原创 用 System V IPC 消息队列实现简单的 Client&Server 通信

【代码】用 System V IPC 消息队列实现简单的 Client&Service 通信。

2024-05-14 10:11:12 123

原创 ftok()

【代码】ftok()传参需知。

2024-03-26 17:17:46 73

原创 System V IPC 消息队列

这是 System V IPC 用到的一个公共结构体,其中,ipc_perm.key 被称之为 ipckey,进程间通信本质上其实就是在内核中申请一定的资源,ipckey 就描述着内核中唯一一个消息队列(一块共享内存/一个信号量集)这样的资源,毕竟一个操作系统可以创建出很多个消息队列。

2024-03-21 14:53:24 270

原创 命名管道打开规则

4、O_NONBLOCK enable: open 调用返回 -1,errno 值为 ENXIO(6)1、O_NONBLOCK disable:open 调用阻塞,直到有进程为写而打开该 FIFO。3、O_NONBLOCK disable:open 调用阻塞,直到有进程为读而打开该 FIFO。2、O_NONBLOCK enable: open 调用返回文件描述符。

2024-03-19 10:58:52 358

原创 IPC之管道

一个进程通过系统调用 pipe 创建出一个匿名管道,操作系统就会在内核中创建一块没有明确标识的缓冲区,并返回给创建进程两个文件描述符作为管道的操作句柄供进程来操作管道,一个描述符用于从管道中读,另一个用于往管道中写。其中,fd[0]表示读端,fd[1]表示写端。因此匿名管道只能用于具有亲缘关系的进程间通信,因为子进程能复制父进程的文件描述符表。4、进程退出,匿名管道被释放,也就是匿名管道的生命周期随进程,这里的进程指持有匿名管道的最后一个进程,当然也可以主动关闭所有进程的有关匿名管道的那两个文件描述符。

2024-03-15 16:33:51 555

原创 管道读写规则及 PIPE_BUF 涉及的写原子性问题

【代码】管道读写规则及 PIPE_BUF 涉及的写原子性问题

2024-03-06 15:16:25 455

原创 Pipe Capacity(管道容量)

【代码】Pipe Capacity(管道容量)

2024-03-06 13:10:29 384

原创 《深入分析Linux内核源码》

《Linux操作系统内核分析》1《Linux操作系统内核分析》2《深入分析Linux内核源码》

2020-10-15 12:15:52 268

原创 const *与*const的区别

const *p:p指向地址的内容不可变,p可变;*const p:p不可变,p指向地址的内容可变。

2020-09-28 18:18:24 220

原创 Xshell设置缓冲区大小以便保留更多的交互信息

Xshell中有一项缓冲区设置的配置,我们可以对这项内容进行设置来影响xshell客户端屏幕的信息数量。首先我们需要了解,Xshell的屏幕输出都是由缓冲区的大小来决定的,如果设置的数值较大我们就可以在Xshell的客户端中保留更多的记录以便等需要的时候可以随时查看,反之则会保留较少的信息,两者各有优劣势,看需求决定如何配置。方法1:方法2:除了在会话管理界面进入属性设置,我们也可以在进入会话连接后在进行设置。...

2020-09-18 00:09:50 966

原创 Xshell 设置鼠标左键选中即复制,右键粘贴

Xshell 设置鼠标左键选中即复制,右键粘贴打开xshell,选择【工具】-【选项】-【键盘和鼠标】,[ 向右按钮 ] 改为 [ 粘贴剪贴板内容 ],下面勾选将选定的文本自动复制的剪贴板即可。

2020-09-16 11:44:16 7101

原创 线程池

线程池(一种线程使用模式):至少包含有一个线程+任务队列,也就是一个线程也可以组成一个线程池。线程池有什么用?应用场景,双十一,在淘宝买东西,给服务器发送请求,一瞬间几百万个请求就过去了,淘宝创建线程去处理请求,你不可能创建几百万个线程,大量线程的创建有可能瞬间耗光资源,服务器就崩溃了,也就是说创建线程也得有个上限,但是这些请求怎么办?这么多线程只能处理这么多,其余的只能丢掉了,所以就得有地...

2019-10-31 17:54:04 113

原创 线程安全的同步与互斥总结

互斥的实现:互斥锁、信号量同步的实现:条件变量、信号量

2019-10-31 17:30:02 126

原创 生产者与消费者模型+POSIX信号量

生产者与消费者模型(以做面与吃面为例)一个场所(只有一口锅,也就是放置数据的地方只有一个)、两种角色、三种关系(生产者之间互斥(我放的时候,你就不能放,因为会造成数据混乱)、消费者之间互斥(因为你们俩没必要抢同一数据处理吧)、生产者与消费者之间是同步+互斥(总不能面做到一半你就吃吧))。这个模型用来:解耦和(如果在没有场所保存数据的情况下,也就是生产者生产出数据就得交给消费者来处理数据,如果直...

2019-10-31 17:24:05 746

原创 线程安全=同步+互斥

线程安全:多个线程同时对临界资源(例如,全局变量)(临界区:对临界资源操作的代码,说白了临界区就是对临界资源的操作)进行访问而不会造成数据二义。大部分情况,线程使用的数据都是局部变量(全局变量是直接共享的,堆区和局部变量需要通过create函数的参数4传参进去才能间接共享),变量的地址空间在线程栈空间内,这种情况,变量归属单个线程,其他线程无法获得这种变量。但有时候,很多变量都需要在线程间共享,...

2019-10-31 16:54:29 276

原创 线程

多线程?从进程开始延伸:执行流:其实,多个进程就是多个执行流。进程是程序运行的基本单位,进程也是资源分配的基本单位。cpu调度就是调度一个进程。一个执行流指的就是能够独立地执行一段代码和处理数据。其实,线程也是一个执行流。当我们有多个任务想要同时处理的时候,可以选择多进程,也可以选择多线程。只不过多线程所占用的资源相较于多进程要更少。那究竟什么是线程?线程:线程是一个执行流,独立地执...

2019-10-30 18:29:37 255

原创 volatile

volatile:保持内存的可见性,告知编译器,被该关键字修饰的变量,不允许被优化,对该变量的任何操作,都必须在真实的内存中进行操作(每次需从内存中读出以保证内存的可见性)。该关键字在C当中我们已经有所涉猎,今天我们站在信号的角度重新理解一下。[ming@190401 ~]$ cat sig.c#include<stdio.h>#include<signal.h> ...

2019-10-30 18:15:39 226

原创 sleep函数

sleep函数的实现,先alarm定时器,然后pause暂停,SIGALAM的默认处理动作会导致进程退出,修改SIGALAM的处理方式,但是可以打断当前的阻塞操作,pause被打断,程序继续往下走。但是这个sleep是有问题的。alarm(3);pause();alarm(3);和pause();之间并不是原子操作,这时候来了一个其他信号,这个信号的回调函数只干了一件事,sleep(10)...

2019-10-30 18:03:34 645

原创 可重入函数

可重入函数和不可重入函数,这也是一种竞态条件/竞争执行。#include<stdio.h>#include<unistd.h>#include<signal.h>int a = 1, b =1;int sum(int *b, int *a){ (*a)++; sleep(3);//sleep只是放大了这一过程,方便看清情况 (*b)++;...

2019-10-30 17:57:29 1114

原创 SIGCHILD信号

SIGCHILD信号,子进程先于父进程退出的话,操作系统通过此信号通知父进程,这个信号的默认处理方式是忽略处理。这就是为什么子进程退出,父进程没有任何反应的原因。正是父进程对这个信号采用默认的忽略式处理,导致父进程不知道子进程到底什么时候退出,因此导致wait阻塞等待,自定义SIGCHILD,在回调函数中调用waitpid/wait来处理这个子进程。但是SIGCHILD是个非可靠信号,一个父进程...

2019-10-30 17:51:29 1806

原创 进程信号

注意:信号不是信号量用户输入命令,在shell(bash)下启动一个前台程序。用户按下“Ctrl+c”,这时 键盘输入 产生一个硬件中断,被操作系统获取,并解释成信号,发送给目标前台进程,前台进程因为收到信号,进而引起进程退出。注意:1、“Ctrl+c”产生的信号只能发给前台进程,一个命令后面加个&就可以放到后台运行(fg:把后台运行的进程放到前台来执行),这样bash不必等待进程结束就可以接受新的命令,启动新的进程了。2、bash可以同时运行一个前台进程和任意多个后台进程,只有前台进程才

2019-10-28 16:55:52 618

原创 进程间通信之System V共享内存

共享内存:最快的进程间通信方式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说,进程不再通过执行进入内核的系统调用来传递彼此的数据。管道通信:通信的本质是通过内核的缓冲区来实现通信进程一:将数据从用户态自己定义的缓冲区拷贝到内核态缓冲区进程二:将数据从内核态缓冲区拷贝到用户态自己定义的缓冲区struct shmid_ds:共享内存数据结构1、在...

2019-10-28 16:53:13 189

原创 进程间通信之System V消息队列

struct ipc_perm:这是System V版本系列进程间通信所用到的一个公共版结构体。也就是Linux内核为每个IPC对象维护一个数据结构。第一字段,这个属性非常重要,它称之为ipckey。进程间通信的方式其实本质上它们都得在内核中申请一定的资源,而ipckey其实就是在描述着内存中惟一 一个消息队列/一块共享内存/一个信号量集这样的资源,因为一个操作系统可以创建很多个消息队列。S...

2019-10-28 16:37:28 344

原创 管道的原子性问题

管道(匿名/命名管道)的写数据大小在不超过PIPE_BUF(65536字节)时,内核能保证操作的原子性。如果写入的数据大小超过PIPI_BUF,内核很有可能会把此数据与其它进程的对此管道的写操作交替起来,这样的话,数据就乱了。POSIX规定,小于PIPE_BUF的写操作必须是原子操作:要写的数据应该被连续地写到管道;大于PIPE_BUF的写操作可能是非原子的:内核可能会将数据与其他进程写入的数据...

2019-10-28 15:56:30 747

原创 Linux背景

1.发展史Linux从哪里来?它是怎么发展的?在这里简要介绍Linux的发展史。要说Linux,还得从UNIX说起。UNIX发展史1968年,一些来自通用电器公司、贝尔实验室和麻省理工学院的研究人员开发了一个名叫Multics的特殊操作系统。Multics在多任务文件管理和用户连接中综合了许多新概念。1969-1970年,AT&T的贝尔实验室研究人员Ken Tompson和Denn...

2019-10-28 14:02:24 835

原创 进程间通信之管道

进程间通信(IPC):操作系统为用户提供的几种进程间的通信方式进程之间具有独立性:一个进程是不能修改另一个进程内存中的数据的,也不能去读另一个进程的虚拟地址空间中的内容。而且用户的程序也不能访问内核空间。每个进程都有自己的一份独立的虚拟地址空间。一个进程只能访问自己的虚拟地址空间。虚拟地址空间有个非常大的好处,那就是使进程间互不干扰,相互独立。但是,进程的独立性也有一个问题,如果多个进程之间想相互沟通,此时却无法直接进行通信,因此需要操作系统提供一些公共的媒介来让多个进程都能通过访问这个媒介进行通信

2019-10-27 18:47:22 540

原创 tcp的三次握手建立连接和四次挥手断开连接

tcp的三次握手建立连接tcp的四次挥手断开连接TCP断开连接为什么需要4次握手?3次不行吗?solution1solution2那为什么我的tcp关闭是三次挥手而不是四次挥手?solution...

2019-10-27 15:46:40 181

原创 运算符优先级问题

相同优先级中,按结合性进行结合。结合性当一个运算对象两侧的运算符优先级别相同时,则按运算符的结合性来确定表达式的运算顺序。关于结合性的概念在其他高级语言中是没有的,这是C语言的特点之一。在标准C语言的文档里,对操作符的结合性并没有做出非常清楚的解释。一个满分的回答是:它是仲裁者,在几个操作符具有相同的优先级时决定先执行哪一个。C语言也将34种运算符规定了不同的结合性。大多数运算符结合方向是...

2019-10-25 13:04:20 516

原创 相关字符串函数与内存操作函数的实现

模拟实现strlen方式1int my_strlen(const char *str){ int count = 0; while(*str) { count++; str++; } return count;};方式2//不能创建临时变量计数器//用递归int my_strlen(const char *str){ if(*str == '\0') r...

2019-10-24 19:55:24 102

原创 内存操作函数

1、void *memcpy(void *desination, const void *source, size_t num);//从source的位置开始向后复制num个字节的数据到desination的内存位置。//注意:这个函数在遇到’\0’的时候不会停下来。2、void *memmove(void *desination, const void *source, size_t...

2019-10-24 18:48:43 184

原创 字符函数和字符串函数

求字符串长度size_t strlen(const char *str);str指向的字符串必须以’\0’结束,strlen函数返回的数值并不包含’\0’。还需要注意的是strlen 的返回值是size_t,是无符号的整型。int main(){ const char str1 = “abcdef”; const char str2 = “hijk”; if(strlen(str2...

2019-10-24 16:43:42 253

原创 主机字节序—大小端

主机字节序:cpu对内存进行存取数据的顺序大小端取决于cpu的架构(x86架构的cpu都是小端)字节序针对的是数据存储类型大于1字节的数据,而且不管是大端还是小端,cpu对内存进行存取数据的顺序都是从低地址到高地址。同小异大小端:低字节数据存储在低地址处,高字节数据存储在高地址处。大端:高字节数据存储在低地址处,低字节数据存储在高地址处。判断大小端利用联合体判断大小端union U...

2019-10-21 18:37:51 307

原创 malloc之struct _CrtMemBlockHeader

struct _CrtMemBlockHeader它存放了你申请的内存块信息,而这个结构体就存放在malloc所申请 返回的指针上面。typedef struct _CrtMemBlockHeader{ struct _CrtMemBlockHeader *pBlockHeaderNext;//下一个结构体指针 struct _CrtMemBlockHeader *pBloc...

2019-10-21 18:00:01 734

原创 野指针和悬垂指针

野指针野指针:指向“垃圾”内存(不可用内存)的指针产生原因:指针创建时未初始化int *p;//此时p为野指针解决办法:指针创建时对其进行初始化int *p = NULL;悬垂指针悬垂指针所指向的空间已经被释放了,但是free后并没有修改指针为NULL,仍旧指向原空间。解决办法:free后,将指针设为NULL。char *p = (char *)malloc(12);free(...

2019-10-21 15:00:18 556

原创 C-struct/union/enum

在C语言中,要求一个结构或联合至少有一个成员,enum无所谓。struct A//报错,C 要求一个结构或联合至少有一个成员{};union B//报错,C 要求一个结构或联合至少有一个成员{};enum C//ok{};//enum C的大小仍旧为4struct A{ char a; int b;};union B{ char a; int b;};...

2019-10-21 11:51:11 552

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除