LinuxIPC通信之匿名管道(C+Python实现)_c++和python ipc通讯-程序员宅基地

技术标签: LinuxIPC通信  C pipe  Linux进程通信  linux IPC  Python Pipe  

进程通信是指在进程间传输数据(交换信息)。进程通信根据交换信息量的多少和效率的高低,分为低级通信(只能传递状态和整数值)和高级通信(提高信号通信的效率,传递大量数据,减轻程序编制的复杂度)。其中高级进程通信分为三种方式:共享内存模式、消息传递模式、共享文件模式。

在别人博客看到的这段话,也不知道那个抄那个的哈哈

linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的。而对Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间通信方面的侧重点有所不同。前者对Unix早期的进程间通信手段进行了系统的改进和扩充,形成了“system V IPC”,通信进程局限在单个计算机内;后者则跳过了该限制,形成了基于套接口(socket)的进程间通信机制。

常见的通信方式:

1. 管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
2. 命名管道FIFO:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。

3. 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
4. 消息队列MessageQueue:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
5. 共享存储SharedMemory:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号,配合使用,来实现进程间的同步和通信。
6. 信号量Semaphore:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
7. 套接字Socket:套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。

第一篇首先来实现pipe通信

匿名管道:

  • 只能用于具有血缘关系的进程之间通信
  • 生命周期随进程,进程退出,管道释放
  • 管道是半双工的,数据只能从一个方向传输
  • 管道是基于字节流的
  • 管道是自带同步机制的,在保证数据安全的前提下,按照特定顺序访问临界资源

python:

函数说明:

multiprocessing.Pipe([duplex]) 返回2个连接对象(conn1, conn2),代表管道的两端,默认是双向通信.

如果duplex=False,conn1只能用来接收消息,conn2只能用来发送消息.不同于os.open之处在于os.pipe()返回2个文件描述符(r, w),表示可读的和可写的

多进程 Multiprocessing 模块

Process 类
Process 类用来描述一个进程对象。创建子进程的时候,只需要传入一个执行函数和函数的参数即可完成 Process 示例的创建。

star() 方法启动进程,
join() 方法实现进程间的同步,等待所有进程退出。
close() 用来阻止多余的进程涌入进程池 Pool 造成进程阻塞。
multiprocessing.Process(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
target 是函数名字,需要调用的函数
args 函数需要的参数,以 tuple 的形式传入

#!/usr/bin/python3
import multiprocessing

arron_say=('1','3','5','7','9')
kobe_say=('2','4','6','8','10')

def arron_handler(read_fd,write_fd):
    for str in kobe_say:
        print("kobe say:>%s"%read_fd.recv())
        write_fd.send(str)

def kobe_handler(read_fd,write_fd):
    for str in arron_say:
        write_fd.send(str)
        print("arron say:>%s"%read_fd.recv())

(read_fd1,write_fd1) = multiprocessing.Pipe()
(read_fd2,write_fd2) = multiprocessing.Pipe()

arron = multiprocessing.Process(target=arron_handler,args=(read_fd1,write_fd2))

arron.start()
kobe_handler(read_fd2,write_fd1)
#arron.start()
read_fd1.close()
read_fd2.close()
write_fd1.close()
write_fd2.close()

arron.join()

C:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>

int main(int argc, char **argv)
{
	int fd[2];

	if(pipe(fd) == -1)
	{
		perror("pipe()");
		exit(1);
	}

	pid_t x = fork();

	if(x == 0)
	{
		char *s = "hello, I am your child\n";
		write(fd[1], s, strlen(s));
	}
	
	if(x > 0)
	{
		char buf[30];
		bzero(buf, 30);

		read(fd[0], buf, 30);
		printf("from child: %s", buf);
	}

	close(fd[0]);
	close(fd[1]);
	return 0;
}

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_38452632/article/details/85234864

智能推荐

ffmpeg 从avio_read 到 file_read-程序员宅基地

文章浏览阅读1k次,点赞24次,收藏10次。第一层: aviobuf.c中, AVIOContext对象当家, 这就是pReadCtx.第二层: avio.c中, URLContext 当家, 简记为h.第三层: file.c中, FileContext 对象当家,简记为c.

接口相关配置_tvbox黄源接口9月-程序员宅基地

文章浏览阅读7.3k次。1,相关接口系统配置(1)配置应用服务器,选择YES(2)网关配置点击ping网关,显示status:active则网关正常。(3)点击网关设置属性配置peoplesoft节点配置填写正确的应用程序服务器url,用户id为ps,tools发行版本为开发工具版本,可点击开发工具help,about application designer 查看版本..._tvbox黄源接口9月

素数筛_acm素數篩-程序员宅基地

文章浏览阅读110次。We know what a base of a number is and what the properties are. For example, we use decimal number system, where the base is 10 and we use the symbols - {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}. But in different bases we use different symbols. For example in binary _acm素數篩

Appium 自动化测试详解元素定位方式_appium 根据class定位元素driver.find_element(appiumby.cla-程序员宅基地

文章浏览阅读1.9k次,点赞2次,收藏21次。简介在做UI自动化的时候,有很大一部分精力是在进行定位元素操作,元素定位如果不准确,直接影响自动化的成败和效率环境Appium server :v1.20.2Appium-Python-Client :2.1.2selenium 4.1.0常用的元素定位方式id定位元素class_name定位元素content-desc定位元素name 定位元素 (appium1.5及之后的版本废弃了name属性)xpath定位元素uiautomator定位元素,Android独有id 定_appium 根据class定位元素driver.find_element(appiumby.class_name

Anaconda的python虚拟环境中安装cudatoolkit和cudnn加速tensorflow_conda安装cudatoolkit(1)_虚拟环境中下载cudatoolkit-程序员宅基地

文章浏览阅读811次,点赞25次,收藏11次。大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**_虚拟环境中下载cudatoolkit

uniapp小程序让页面滚动到底部_uni-app开发之使用scroll-view实现QQ小程序自动滑动到底部(二)...-程序员宅基地

文章浏览阅读3k次。版权声明:本文为博主原创文章,如果转载请给出原文链接:http://doofuu.com/article/4156212.html最近在开发一款情侣星座测试类型的QQ小程序。小程序中用到了类似聊天的界面,其中需要每次发完信息自动滑动到底部的需求。小程序滑动不像HTML那么简单,可以直接定位元素位置。不慌! 在小程序中虽然不像HTML中实现自动滑动到底部那么简单,不管是QQ小程序、还是微信小程序都有..._uniapp滚动到底部

随便推点

【Linux命令-转载】nohup 和 & 绝配(让命令在后台执行)-程序员宅基地

文章浏览阅读428次。nohup 的作用可以将程序以忽略挂起信号(SIGHUP)的方式运行。常见的用法是和 & 命令一同使用,将命令放置到后台运行,即使终端挂掉,进程会忽略挂起信号,继续运行。将程序放到后台运行,一般有两种方式:(1)command &:后台运行,关掉终端会停止运行。(2)nohup command & :后台运行,关掉终端也会继续运行。「注意:」(1)如果使用nohup执行程序未显示进行标准输出重定向,则标准输出默认重定向当前工作目录的 nohup.out 文件中。

2003服务器系统QQ安装不了,windows2003server-程序员宅基地

文章浏览阅读957次。windows2003server是一款针对大中型企业而设计的服务器操作系统,拥有32位和64位两种版本,保证了最佳的灵活性和可伸缩性,它支持的应用程序包括:联网、消息传递、清单和顾客服务系统、数据库、电子商务 Web 站点以及文件和打印服务器。有需要的朋友可以到本站进行下载!windows2003server简介:Windows Server 2003 企业版允许通过添加处理器和内存来提高服务器..._qq winserver

最新《市场调研与预测》考试重点_实验内容:根据收集的资料和调查分析的结果,进行战略总体决策,制定预算,运用定位策略,表现策略进行策划-程序员宅基地

文章浏览阅读177次。1.通过实地试验进行调查取得的资料,客观实用,排除人们主观估计的偏差2.调研人员可以针对调研事项的需要进行合理的实验设计,有效的控制实验环境,有意识的使调研对象在相同条件下重复出现,反复进行试验,使调研的结果更加准确3.调研人员可以主动的引起市场因素的变化,并通过控制其变化来研究该因素对市场产生的影响,而不是被动、消极的等待某种现象的发生,这是其他调研法无法做到的。一个实际的市场调研与预测设计的目标并不是一定要形成最精确的信息,而是在一定的成本费用条件下形成最有价值的信息。政府部门的市场调研;_实验内容:根据收集的资料和调查分析的结果,进行战略总体决策,制定预算,运用定位策略,表现策略进行策划,对驴友的需求和特点进行分析,展开创意与文案写作,考虑分析网络新产品和服务项目开发的可能性。

vi一个简单操作_vi a.txt-程序员宅基地

文章浏览阅读399次。进入:打开VIM之后,按一下insert键或者i键就可以进入输入状态了 #vi a.txt退出:退出的时候先按Esc键,出来冒号(:)就可以敲命令, q! 回车 不保存 wq 保存 wq!强制保存并推出(适用与只读文件) x 保存_vi a.txt

vue3 antd pro 框架动态路由_vue3+ant design + ts+pro-程序员宅基地

文章浏览阅读629次。1. 在store/user.ts中,找到 GENERATE_ROUTES_DYNAMIC 方法中调用的方法:generatorDynamicRouter(),此方法在在router/router-guards/router-guards.ts中。2. router/router-guards/router-guards.ts中,通过方法getCurrentUserNav(),获取到个人信息中的菜单,将菜单列表传generator()方法中,此方法将菜单列表处理成路由所需格式的路由数组。_vue3+ant design + ts+pro

【华为云技术分享】敏捷开发落地不实际?原因可能在于你的 IDE 工具_华为云ide问题-程序员宅基地

文章浏览阅读3.5k次。对于企业来说,效率就是一切。开发效率的工程化建设已经开始被各大企业提到技术管理日程中。而且现阶段,无论是框架也好、模板也好,目的都是在为提升代码开发效率而努力。随着云计算的深入,端 + 云的开发模式以及完全云端化的开发模式都先后上线,这些无疑都是在对传统 IDE 开发模式的挑战。云端 IDE,会是未来的趋势吗?云时代下,万物上云正在影响企业研发效率工程化建设万物上云,可以说已经是不可逆..._华为云ide问题

推荐文章

热门文章

相关标签