进程间通信

进程间的通信机制有那些(本机IPC)【linux】(zv)

若如初见. 提交于 2020-03-05 23:15:00
进程间的通信机制有那些? 进程间通信的原理 广义上的进程间通信 Linux提供的“进程通信”方式有哪些? 进程间的通信机制有那些? 进程间通信的原理 进程空间各自独立,相互之间没有可以共享的空间,但是OS是所有进程所共享的,那就是,不管运行有多少个进程,但是它们共用OS只有一个。 所有进程共用的是同一个OS,那么显然,所有的进程可以通过大家都共享OS来实现数据的转发。 因此进程间通信的原理就是,OS作为所有进程共享的第三方,会提供相关的机制,以实现进程间数据的转发,达到数据共享的目的。 广义上的进程间通信 其实广义上来说,任何一种能够实现进程间数据交换的方式,都可以被称为进程间通信,比如 A进程——————文件———————B进程 A进程—————数据库——————B进程 不过一般来说,这种广义的进程间通信,并不被算作真正的“进程间通信”。 只有OS所提供的专门的通信机制,才能算作是真正的“进程间通信”。 Linux提供的“进程通信”方式有哪些? Linux的父亲是Unix,所以Linux的进程间通信,其实都是继承于Unix。 Linux所提供的进程间通信机制 管道 无名管道 有名管道 OS在进程之间建立一个“管道”,通过这个管道来实现进程间数据的交换。 消息队列 :通过消息队列来通信 共享内存 :通过共享内存来通信 信号量 :借助通信来实现资源的保护(一种加锁机制) 套接字

Python--线程队列(queue)、multiprocessing模块(进程对列Queue、管道(pipe)、进程池)、协程

那年仲夏 提交于 2020-03-05 00:36:02
队列(queue) 队列只在多线程里有意义,是一种线程安全的数据结构。 get与put方法 ''' 创建一个“队列”对象 import queue q = queue.Queue(maxsize = 10) queue.Queue类即是一个队列的同步实现。队列长度可为无限或者有限。可通过Queue的构造函数的可选参数maxsize来设定队列长度。如果maxsize小于1就表示队列长度无限。 将一个值放入队列中: q.put() 调用队列对象的put()方法在队尾插入一个项目。put()有两个参数,第一个item为必需的,为插入项目的值;第二个block为可选参数,默认为True。如果队列当前为空且block为True,put()方法就使调用线程暂停,直到空出一个数据单元。如果block为False,put方法将引发Full异常。 import queue q=queue.Queue(3) q.put(11) q.put(22) q.put(33) q.put(44,False) #queue.Full ==q.put_nowait() 将一个值从队列中取出 q.get() 调用队列对象的get()方法从队头删除并返回一个项目。可选参数为block,默认为True。如果队列为空且block为True,get()就使调用线程暂停,直至有项目可用。如果队列为空且block为False

通过trace跟踪系统调用

╄→гoц情女王★ 提交于 2020-03-04 15:16:53
简介 strace常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通 过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。 输出参数含义 root@ubuntu:/usr# strace cat /dev/null execve("/bin/cat", ["cat", "/dev/null"], [/* 22 vars */]) = 0brk(0) = 0xab1000access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f29379a7000access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)...brk(0) = 0xab1000brk(0xad2000) = 0xad2000fstat(1, {st_mode=S_IFCHR|0620, st

Linux strace追踪命令详解

穿精又带淫゛_ 提交于 2020-03-04 15:16:25
strace介绍 strace命令是一个集诊断、调试、统计与一体的工具,我们可以使用strace对应用的系统调用和信号传递的跟踪结果来对应用进行分析,以达到解决问题或者是了解应用工作过程的目的。当然strace与专业的调试工具比如说gdb之类的是没法相比的,因为它不是一个专业的调试器。 strace的最简单的用法就是执行一个指定的命令,在指定的命令结束之后它也就退出了。在命令执行的过程中,strace会记录和解析命令进程的所有系统调用以及这个进程所接收到的所有的信号值。 简单用法 root@ubuntu:/usr# strace cat /dev/null execve("/bin/cat", ["cat", "/dev/null"], [/* 22 vars */]) = 0 brk(0) = 0xab1000 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f29379a7000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory

[strace]跟踪进程的系统调用

你。 提交于 2020-03-04 15:15:02
转自 : https://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316692.html 简介 strace常用来跟踪进程执行时的系统调用和所接收的信号,调试应用程序的时候经常使用 。 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通 过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。 输出参数含义 root@ubuntu:/usr# strace cat /dev/null execve("/bin/cat", ["cat", "/dev/null"], [/* 22 vars */]) = 0brk(0) = 0xab1000access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f29379a7000access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or

strace命令

末鹿安然 提交于 2020-03-04 15:14:07
简介 strace常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通 过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。 输出参数含义 root@ubuntu:/usr# strace cat /dev/null execve("/bin/cat", ["cat", "/dev/null"], [/* 22 vars */]) = 0brk(0) = 0xab1000access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f29379a7000access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)...brk(0) = 0xab1000brk(0xad2000) = 0xad2000fstat(1, {st_mode=S_IFCHR|0620, st

8.12并发编程(二)

隐身守侯 提交于 2020-03-04 10:01:12
一、进程间通信   队列:先进先出   堆栈:先进后出 from multiprocessing import Queue q = Queue(5) # 括号内可以传参数 表示的是这个队列的最大存储数 # 往队列中添加数据 q.put(1) q.put(2) # print(q.full()) # 判断队列是否满了 q.put(3) q.put(4) q.put(5) # print(q.full()) # q.put(6) # 当队列满了之后 再放入数据 不会报错 会原地等待 直到队列中有数据被取走(阻塞态) print(q.get()) print(q.get()) print(q.get()) print(q.empty()) # 判断队列中的数据是否取完 print(q.get()) print(q.get()) print(q.empty()) # print(q.get_nowait()) # 取值 没有值不等待直接报错 # print(q.get()) # 当队列中的数据被取完之后 再次获取 程序会阻塞 直到有人往队列中放入值 """ full get_nowait empty 都不适用于多进程的情况 """ 一、进程间通信IPC机制 1.如何实现:   子进程放数据,主进程获取数据   两个子进程相互放,取数据 from multiprocessing import

Linux Rootkit Learning

萝らか妹 提交于 2020-03-04 09:51:56
目录 1. 学习Rootkit需要了解的基础知识 2. 挂钩(HOOKING) 3. 直接内核对象操作 4. LSM框架(Linux Security Module)于LKM安全 5. rootkit检测技术及工具 1. 学习Rootkit需要了解的基础知识 0x1: 什么是rootkit rootkit是允许某人控制操作系统的特定方面而不暴露他或她的踪迹的一组代码。从根本上说来,用户无法察觉这种特性构成了rootkit。rootkit会想尽办法去隐藏自己的网络、进程、I/O等信息(注意,这里所谓的隐藏,只是针对ring3的ui隐藏,内核层的功能不能隐藏,否则rootkit自己也无法使用功能了),所以,rootkit的攻防问题很大程度上是一个ring0争夺战的问题,监控程序必须直接深入到系统的底层去获取最原始的数据,才能避免因为rootkit的ring3隐藏导致的误判 0x2: 可装载内核模块(LKM) Linux就是通常所说的单内核(monolithic kernel),它与微型内核(windows系统中常见)不同 1. Linux中的单内核 操作系统的大部分功能都被称为内核,并在特权模式下运行。同时,linux也提供动态扩充系统功能的机制(可以将新的功能加载到内核、从内核去除某个功能),通过Linux内核模块(LKM)可以在运行时动态地更改Linux的内核

进程间通信之------- 命名管道

混江龙づ霸主 提交于 2020-03-04 05:48:07
我们知道管道包括三种: 1):普通管道PIPE,通常有很多限制,一是半双工,只能单向传输,二是只能在父子进程间使用 2):流管道:这种能双向传输,但是也是只能父子进程间使用。 3):命名管道,去除了以上的第二种限制,可以在许多不相关的进程间进行通讯。也是半双工的通信方式。 但是通常我们把管道分为匿名管道和命名管道。但对于匿名管道的话,只能在本机上进程之间通信,而且只能实现本地的父子进程之间的通信,局限性太大了。而这里介绍的命名管道,就和匿名管道有些不同了,在功能上也就显得强大许多,至少其可以实现跨网络之间的进程的通信,同时其客户端既可以接收数据也可以发送数据,服务器端也是可以接收数据,又可以发送数据。 匿名管道的概述    对于匿名管道而言,命名管道使用了windows安全机制,因而命名管道的服务器端可以控制哪些客户有权与其建立连接。哪些客户端是不能够与这个命名管道建立连接的。命名管道的通信是以连接的方式进行的,服务器创建一个命名管道对象,然后在此对象上等待连接请求,一旦客户连接过来,则两者都可以通过命名管道读或者写数据。   命名管道提供了两种通信模式:字节模式和消息模式。在字节模式下,数据以一个连续的字节流的形式在客户机和服务器之间流动。而在消息模式下,客户机和服务器则通过一系列不连续的数据单位,进行数据的收发,每次在管道上发出一个消息后,它必须作为一个完整的消息读入。

进程间通信 - 命名管道实现

南笙酒味 提交于 2020-03-04 05:47:46
引子 好,到这里呢,就需要介绍实现进程间通信的第四种方式了, 也就是通过命名管道来实现,前面介绍的那三种方式呢,都是有缺陷或者说局限性太强, 而这里介绍的命名管道相对来说,在这方面就做得好很多了, 比如,剪贴板的话只能实现本机上进程之间的通信, 而邮槽的话虽然是可以实现跨网络之间的进程的通信, 但麻烦的是邮槽的服务端只能接收数据,邮槽的客户端只能发送数据,太悲剧了, 而对于匿名管道的话,其也只能实现本机上进程之间的通信, 你要是能够实现本机进程间的通信也就算了, 关键是它还只用来实现本地的父子进程之间的通信,也太局限了吧? 而这里介绍的这个命名管道的话,就和他们有些不同了,在功能上也就显得强大很多了, 至少其可以实现跨网络之间的进程的通信,同时其客户端既可以接收数据也可以发送数据, 服务端也是既可以接收数据,又可以发送数据的。 命名管道概述 命名管道是通过网络来完成进程之间的通信的,命名管道依赖于底层网络接口, 其中包括有 DNS 服务,TCP/IP 协议等等机制,但是其屏蔽了底层的网络协议细节, 对于匿名管道而言,其只能实现在父进程和子进程之间进行通信,而对于命名管道而言, 其不仅可以在本地机器上实现两个进程之间的通信,还可以跨越网络实现两个进程之间的通信。 命名管道使用了 Windows 安全机制,因而命名管道的服务端可以控制哪些客户有权与其建立连接,