- 博客(89)
- 收藏
- 关注
原创 进程间通信(IPC)
进程间具有独立性(每个进程都有自己的一份独立的虚拟地址空间,一个进程只能访问自己的虚拟地址空间,但不包括内核空间,不能访问其他进程的),如果多进程之间想相互通信,此时无法直接进行(一个进程不能读取其他进程的虚拟地址空间中的内容,更不能去修改),因此需要操作系统提供一些公共资源(内存、文件等)来让多个进程都能通过访问这个媒介进行通信。2、System V IPC:一套较古老的标准。3、POSIX IPC:一套跨平台的新标准。操作系统为用户提供的几种进程间的通信方式。1、管道:最古老的通信形式。
2024-03-15 14:45:21 427
原创 数组名及数组传参问题
数组名#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 584
原创 System V IPC 共享内存
共享内存是最快的进程间通信方式,一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说,进程不再通过执行进入内核的系统调用来传递彼此的数据。
2024-05-14 17:13:40 242
原创 用 System V IPC 消息队列实现简单的 Client&Server 通信
【代码】用 System V IPC 消息队列实现简单的 Client&Service 通信。
2024-05-14 10:11:12 159
原创 System V IPC 消息队列
这是 System V IPC 用到的一个公共结构体,其中,ipc_perm.key 被称之为 ipckey,进程间通信本质上其实就是在内核中申请一定的资源,ipckey 就描述着内核中唯一一个消息队列(一块共享内存/一个信号量集)这样的资源,毕竟一个操作系统可以创建出很多个消息队列。
2024-03-21 14:53:24 289
原创 命名管道打开规则
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 382
原创 IPC之管道
一个进程通过系统调用 pipe 创建出一个匿名管道,操作系统就会在内核中创建一块没有明确标识的缓冲区,并返回给创建进程两个文件描述符作为管道的操作句柄供进程来操作管道,一个描述符用于从管道中读,另一个用于往管道中写。其中,fd[0]表示读端,fd[1]表示写端。因此匿名管道只能用于具有亲缘关系的进程间通信,因为子进程能复制父进程的文件描述符表。4、进程退出,匿名管道被释放,也就是匿名管道的生命周期随进程,这里的进程指持有匿名管道的最后一个进程,当然也可以主动关闭所有进程的有关匿名管道的那两个文件描述符。
2024-03-15 16:33:51 591
原创 Xshell 设置缓冲区大小以便保留更多的交互信息
首先我们需要了解,Xshell的屏幕输出都是由缓冲区的大小来决定的,如果设置的数值较大我们就可以在Xshell的客户端中保留更多的记录以便等需要的时候可以随时查看,反之则会保留较少的信息,两者各有优劣势,看需求决定如何配置。Xshell中有一项缓冲区设置的配置,我们可以对这项内容进行设置来影响xshell客户端屏幕的信息数量。方法2:除了在会话管理界面进入属性设置,我们也可以在进入会话连接后在进行设置。
2020-09-18 00:09:50 1039
原创 Xshell 设置鼠标左键选中即复制,右键粘贴
打开xshell,选择【工具】-【选项】-【键盘和鼠标】,[ 向右按钮 ] 改为 [ 粘贴剪贴板内容 ],下面勾选将选定的文本自动复制的剪贴板即可。
2020-09-16 11:44:16 8803 1
原创 线程池
线程池(一种线程使用模式):至少包含有一个线程+任务队列,也就是一个线程也可以组成一个线程池。线程池有什么用?应用场景,双十一,在淘宝买东西,给服务器发送请求,一瞬间几百万个请求就过去了,淘宝创建线程去处理请求,你不可能创建几百万个线程,大量线程的创建有可能瞬间耗光资源,服务器就崩溃了,也就是说创建线程也得有个上限,但是这些请求怎么办?这么多线程只能处理这么多,其余的只能丢掉了,所以就得有地...
2019-10-31 17:54:04 119
原创 生产者与消费者模型+POSIX信号量
生产者与消费者模型(以做面与吃面为例)一个场所(只有一口锅,也就是放置数据的地方只有一个)、两种角色、三种关系(生产者之间互斥(我放的时候,你就不能放,因为会造成数据混乱)、消费者之间互斥(因为你们俩没必要抢同一数据处理吧)、生产者与消费者之间是同步+互斥(总不能面做到一半你就吃吧))。这个模型用来:解耦和(如果在没有场所保存数据的情况下,也就是生产者生产出数据就得交给消费者来处理数据,如果直...
2019-10-31 17:24:05 785
原创 线程安全=同步+互斥
线程安全:多个线程同时对临界资源(例如,全局变量)(临界区:对临界资源操作的代码,说白了临界区就是对临界资源的操作)进行访问而不会造成数据二义。大部分情况,线程使用的数据都是局部变量(全局变量是直接共享的,堆区和局部变量需要通过create函数的参数4传参进去才能间接共享),变量的地址空间在线程栈空间内,这种情况,变量归属单个线程,其他线程无法获得这种变量。但有时候,很多变量都需要在线程间共享,...
2019-10-31 16:54:29 304
原创 线程
多线程?从进程开始延伸:执行流:其实,多个进程就是多个执行流。进程是程序运行的基本单位,进程也是资源分配的基本单位。cpu调度就是调度一个进程。一个执行流指的就是能够独立地执行一段代码和处理数据。其实,线程也是一个执行流。当我们有多个任务想要同时处理的时候,可以选择多进程,也可以选择多线程。只不过多线程所占用的资源相较于多进程要更少。那究竟什么是线程?线程:线程是一个执行流,独立地执...
2019-10-30 18:29:37 295
原创 volatile
volatile:保持内存的可见性,告知编译器,被该关键字修饰的变量,不允许被优化,对该变量的任何操作,都必须在真实的内存中进行操作(每次需从内存中读出以保证内存的可见性)。该关键字在C当中我们已经有所涉猎,今天我们站在信号的角度重新理解一下。[ming@190401 ~]$ cat sig.c#include<stdio.h>#include<signal.h> ...
2019-10-30 18:15:39 237
原创 sleep函数
sleep函数的实现,先alarm定时器,然后pause暂停,SIGALAM的默认处理动作会导致进程退出,修改SIGALAM的处理方式,但是可以打断当前的阻塞操作,pause被打断,程序继续往下走。但是这个sleep是有问题的。alarm(3);pause();alarm(3);和pause();之间并不是原子操作,这时候来了一个其他信号,这个信号的回调函数只干了一件事,sleep(10)...
2019-10-30 18:03:34 684
原创 可重入函数
可重入函数和不可重入函数,这也是一种竞态条件/竞争执行。#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 1141
原创 SIGCHILD信号
SIGCHILD信号,子进程先于父进程退出的话,操作系统通过此信号通知父进程,这个信号的默认处理方式是忽略处理。这就是为什么子进程退出,父进程没有任何反应的原因。正是父进程对这个信号采用默认的忽略式处理,导致父进程不知道子进程到底什么时候退出,因此导致wait阻塞等待,自定义SIGCHILD,在回调函数中调用waitpid/wait来处理这个子进程。但是SIGCHILD是个非可靠信号,一个父进程...
2019-10-30 17:51:29 1881
原创 进程信号
注意:信号不是信号量用户输入命令,在shell(bash)下启动一个前台程序。用户按下“Ctrl+c”,这时 键盘输入 产生一个硬件中断,被操作系统获取,并解释成信号,发送给目标前台进程,前台进程因为收到信号,进而引起进程退出。注意:1、“Ctrl+c”产生的信号只能发给前台进程,一个命令后面加个&就可以放到后台运行(fg:把后台运行的进程放到前台来执行),这样bash不必等待进程结束就可以接受新的命令,启动新的进程了。2、bash可以同时运行一个前台进程和任意多个后台进程,只有前台进程才
2019-10-28 16:55:52 723
原创 进程间通信之System V共享内存
共享内存:最快的进程间通信方式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说,进程不再通过执行进入内核的系统调用来传递彼此的数据。管道通信:通信的本质是通过内核的缓冲区来实现通信进程一:将数据从用户态自己定义的缓冲区拷贝到内核态缓冲区进程二:将数据从内核态缓冲区拷贝到用户态自己定义的缓冲区struct shmid_ds:共享内存数据结构1、在...
2019-10-28 16:53:13 202
原创 进程间通信之System V消息队列
struct ipc_perm:这是System V版本系列进程间通信所用到的一个公共版结构体。也就是Linux内核为每个IPC对象维护一个数据结构。第一字段,这个属性非常重要,它称之为ipckey。进程间通信的方式其实本质上它们都得在内核中申请一定的资源,而ipckey其实就是在描述着内存中惟一 一个消息队列/一块共享内存/一个信号量集这样的资源,因为一个操作系统可以创建很多个消息队列。S...
2019-10-28 16:37:28 408
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人