20155239吕宇轩 Linux下IPC机制
20155239吕宇轩 Linux下IPC机制
- 共享内存
原理:把所有需要使用的共享数据都存放在共享内存 区域中,任何想要访问这些共享数据的进程都必须在自己的进程地址空间中新增加一块内存区域,用来映射存放共享数据的物理内存页面;也就是说,任何想要访问这些共享数据的进程都必须把存放共享数据的物理内存页面的全部地址空间都映射到自己的进程地址空间中。
System V共享内存通过系统调用shmget()来获得或创建一个IPC共享内存区域,并返回这个共享内存区域的唯一标识符.内核在保证系统调用shmget()获得或创建一个共享内存区域,并初始化该共享内存区域对应的shmid_kernel结构的同时,还将在特殊文件系统shm中创建或打开一个同名的文件,并在内存中建立起该文件的struct dentry和struct inode结构,新建的文件不属于任何一个进程(任何进程够可以访问该共享内存区域).所有这一切操作都是系统调用shmget()完成的
遇到的问题:
一:什么是System V?
答:Unix操作系统众多版本中的一支,第四版本,是最成功的版本,成为一些UNIX共同特性的源头。
二:什么是struct dentry和struct inode结构?
答:内核中用inode结构表示具体的文件,dentry 的中文名称是目录项,是Linux文件系统中某个索引节点(inode)的链接。这个索引节点可以是文件,也可以是目录。inode(可理解为ext2inode)对应于物理磁盘上的具体对象,dentry是一个内存实体,其中的d_inode成员指向对应的inode。也就是说,一个inode可以在运行的时候链接多个dentry,而d_count记录了这个链接的数量。
管道
管道通信的原理:内核维护的一块内存,有读端和写端(管道是单向通信的);
管道通信的方法:父进程创建管道后fork子进程,子进程继承父进程的管道fd。
管道通信的限制:只能在父子进程间通信、半双工。
管道通信的函数:pipe、write、read、close。
一个管道是一个字节流(无边界,顺序的)
从管道中读取数据(读空管道将阻塞,读端遇0为关闭)
管道是单向的
管道的容量是有限的
#include <unistd.h>
int pipe(int filedes[2]);
成功的pipe()调用会在数组filedes中返回两个打开的文件描述符:一个表示管道的读取端(filedes[0]),另一个表示管道的写入端(filedes[1])。与所有文件描述符一样,可以使用read()和write()系统调用来在管道上执行I/O,管道上的read()调用会读取的数据量为所请求的字节数与管道中当前存在的字节数两者之间较小的那个,但当管道为空时阻塞。
FIFO(命名管道)
FIFO与管道类似,它们最大的差别是,FIFO在文件系统中拥有一个名称,并且其打开方式与打开一个普通文件是一样的,这样就能够将FIFO用于非相关进程之间的通信。
1.使用mkfifo命令可以在shell中创建一个fifo
2.$ mkfifo [-m mode] pathname
mkfifo()函数创建一个名为pathname的全新FIFO。大多数UNIX实现提供了mkfifo(),它是构建于mknod()之上的一个库函数。一旦FIFO被创建,任何进程都能够打开它,只要它能够通过常规的文件权限检测。
1。#include <sys/stat.h>
2.int mkfifo(const char *pathname, mode_t mode);
在大多数UNIX实现(包括Linux)上,当打开一个FIFO时可以通过指定O_RDWR标记来绕开打开FIFO时的阻塞行为,这样open()就会立即返回,但无法使用返回的文件描述符在FIFO上读取和写入数据。这种做法破坏了FIFO的I/O模型,SUSv3明确指出以O_RDWR标记打开一个FIFO的结果是未知的,因此出于可移植性的原因,开发人员不应该使用这项技术。对于那些需要避免在打开FIFO时发生阻塞地需求,open()的O_NONBLOCK标记提供了一种标准化的方法来完成这个任务。
信号
信号机制是unix系统中最为古老的进程之间的通信机制,用于一个或几个进程之间传递异步信号。信号可以有各种异步事件产生,比如键盘中断等。shell也可以使用信号将作业控制命令传递给它的子进程。
在此列出几个简单使用方法定义:
#include <sys/types.h>
#include <signal.h>
void (*signal(int sig,void (*func)(int)))(int); //用于截取系统信号,第一个参数为信号,第二个参数为对此信号挂接用户自己的处理函数指针。返回值为以前信号处理程序的指针。
eg.int ret = signal(SIGSTOP, sig_handle);
由于signal不够健壮,推荐使用sigaction函数。
int kill(pid_t pid,int sig); //kill函数向进程号为pid的进程发送信号,信号值为sig。当pid为0时,向当前系统的所有进程发送信号sig。
int raise(int sig);//向当前进程中自举一个信号sig, 即向当前进程发送信号。
#include <unistd.h>
unsigned int alarm(unsigned int seconds); //alarm()用来设置信号SIGALRM在经过参数seconds指定的秒数后传送给目前的进程。如果参数seconds为0,则之前设置的闹钟会被取消,并将剩下的时间返回。使用alarm函数的时候要注意alarm函数的覆盖性,即在一个进程中采用一次alarm函数则该进程之前的alarm函数将失效。
int pause(void); //使调用进程(或线程)睡眠状态,直到接收到信号,要么终止,或导致它调用一个信号捕获函数。
问题一:什么是消息队列?
经过网上查资料学习,消息队列是SystemV版本中三种进程通信机制之一,另外两种是信号量和共享存储段。消息队列提供了进程间发送数据块的方法,而且每个数据块都有一个类型标识。消息队列是基于消息的,而管道是基于字节流。创建的消息队列,生命周期随内核,只有内核重启或用户主动去删除,才可以真正关闭消息队列。
有关命令:
- ipcs -q 消息队列列表
- ipcrm -q msqid(要删除的消息队列ID)
消息队列相关函数
ftok函数
#include <sys/ipc.h>
#include <sys/types.h>
key_t ftok(const char* path, int id);
- ftok 函数把一个已存在的路径名和一个整数标识转换成一个key_t值,即IPC关键字
- path 参数就是你指定的文件名(已经存在的文件名),一般使用当前目录。当产生键时,只使用id参数的低8位。
- id 是子序号, 只使用8bit (1-255)
- 返回值:若成功返回键值,若出错返回(key_t)-1
msgget函数
#include <sys/msg.h>
#include <sys/ipc.h>
int msgget(key_t key, int msgflag);
20155239吕宇轩 Linux下IPC机制的更多相关文章
- 20155239吕宇轩《网络对抗》Exp3 免杀原理与实践
20155239吕宇轩<网络对抗>Exp3 免杀原理与实践 实验过程 Kali使用上次实验msfvenom产生后门的可执行文件,上传到老师提供的网址http://www.virscan.o ...
- stat命令的实现-mysate 20155239吕宇轩
stat命令的实现-mysate 20155239吕宇轩 学习使用stat(1),并用C语言实现 提交学习stat(1)的截图 man -k ,grep -r的使用 伪代码 产品代码 mystate. ...
- 20155202 张旭 课下作业: Linux下IPC机制
20155202张旭 Linux下IPC机制 IPC机制定义 在linux下的多个进程间的通信机制叫做IPC(Inter-Process Communication),它是多个进程之间相互沟通的一种方 ...
- Linux下IPC机制
Linux下IPC机制 实践要求 研究Linux下IPC机制:原理,优缺点,每种机制至少给一个示例,提交研究博客的链接 共享内存 管道 FIFO 信号 消息队列 IPC 进程间通信(IPC,Inter ...
- 20155239吕宇轩 Exp1 PC平台逆向破解(5)M
20155239 网络对抗 Exp1 PC平台逆向破解(5)M 实验内容 (1).掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(1分) (2)掌握反汇编与十六进制编程器 (1分) ...
- linux各种IPC机制(进程通信)
linux各种IPC机制 (2011-07-08 16:58:35) 原文地址:linux各种IPC机制(转)作者:jianpengliu 原帖发表在IBM的developerworks网站 ...
- [转帖]linux各种IPC机制
linux各种IPC机制 docker中的资源隔离,一种就是IPC的隔离.IPC是进程间通信. 下面的文章转载自https://blog.csdn.net/yyq_9623/article/detai ...
- 【Linux下进程机制】从一道面试题谈linux下fork的运行机制
今天一位朋友去一个不错的外企面试linux开发职位,面试官出了一个如下的题目: 给出如下C程序,在linux下使用gcc编译: #include "stdio.h" #includ ...
- linux各种IPC机制
docker中的资源隔离,一种就是IPC的隔离.IPC是进程间通信. 下面的文章转载自https://blog.csdn.net/yyq_9623/article/details/78794775 原 ...
随机推荐
- C# 调用WebService服务
方 法 一 : 选择项目,右键添加服务引用,输入服务地址,如图: 点击确定跳转到如下界面: 调用 接口: ServiceReference1.ImportDataServiceClient sr = ...
- C语言const与#define
const 定义的是变量不是常量,只是这个变量的值不允许改变是常变量!带有类型.编译运行的时候起作用存在类型检查. define 定义的是不带类型的常数,只进行简单的字符替换.在预编译的时候起作用,不 ...
- [UI] MFD UI kit
MFD UI kit https://dribbble.com/whaledesigned
- centos安装epel源后,使用报错(Error: Cannot retrieve repository metadata (repomd.xml) for repository: epel. Please verify its path and try again)
报错如下: Error: Cannot retrieve repository metadata (repomd.xml) for repository: epel. Please verify it ...
- QT导入libcurl支持HTTPS
对于我这种不会编译的人来说,必须找到已经编译好的DLL文件,以及头文件才能使用. 幸运的在这个网站https://stackoverflow.com/questions/28137379/libcur ...
- MEMCACHE与REDIS
千万数据量的高并发,容灾. Redis 基于单线程, 持久性 多数据类型 内存中只存KEY Redis支持数据的备份,即master-slave模式的数据备份. Redis与Memcached的区别 ...
- 丢手绢问题(约瑟夫问题)的python实现
约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉. def fnA(p, personNum, cnt): times = cnt // pe ...
- shell批量远程连接mysql的方法
一.配置mysql服务器ip列表如下,可自定义: S1 1.1.1.1 3306 user passwd11 dbname_s1S2 2.2.2.2 3306 u ...
- 切换composer国内镜像
composer config -g repo.packagist composer https://packagist.phpcomposer.com
- 【洛谷】【二分答案+贪心】P1316 丢瓶盖
[题目描述:] 陶陶是个贪玩的孩子,他在地上丢了A个瓶盖,为了简化问题,我们可以当作这A个瓶盖丢在一条直线上,现在他想从这些瓶盖里找出B个,使得距离最近的2个距离最大,他想知道,最大可以到多少呢? [ ...