Linux--进程间通信、IPC、管道

2023-11-10

目录

1.进程间通信的方法

2.IPC机制

1.有命管道:

1.简介

5.管道的特点

6.循环写读

2.无名管道

1.简介

2.代码

4.总体特点

5.管道实现图


1.进程间通信的方法

(1)管道

(2)信号量

(3)共享内存

(4)消息队列

(5)套接字

2.IPC机制

1.有命管道:

1.简介

1.管道简介

|命令:

举例:ps -ef|grep "sleep"

d9e64fed74814597b6bbf7117c6fd8a1.png

 720cd40a77594667b412dbf7a2c3c261.png

 

两个进程通信,比如a,b进程,a向管道中写入数据,b读取数据;

管道的分类:有名管道和无名管道

区别:有名管道在任意两个进程间通信,无名管道在父子进程间通信;

2.有名管道的创建

创建的命令:mkfifo 管道名

5134a3e272344f46a4d73d5c9ba7e639.png 打开管道:open();

读数据:read();

写入数据:write();

关闭管道:close();

3.有名管道演示进程间通信思考

如果进程 a 要将从键盘获取的数据传递给另一个进程 b, 用已具备的知识思考应该如何完成 ?

1.文件可以,但是不建议;

2.管道:

创建管道之后,它会在内存上分配一块空间,表面上看把数据写入管道中了,实际上是把数据写入内存中了。另外一个程序是从内存中读取数据的,所以效率是比较高的。

管道文件:大小永远为0;

4.有名管道实现进程间通信

又名命名管道;

代码:

a.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
#include <fcntl.h>
int main()
{
	int fd = open("fifi", O_WRONLY);
	assert(fd != -1);
	printf("fd=%d\n", fd);
	write(fd, "hello", 5);
	close(fd);
}

b.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
#include <fcntl.h>
int main()
{
	int fd = open("./fifi", O_RDONLY);
	assert(fd != -1);
	printf("fd=%d\n", fd);
	char buff[128] = { 0 };
	read(fd, buff, 127);
	printf("read:%s\n", buff);
	close(fd);
}

 结果:

996855cbdce04c43a906bfdab808c2e8.png 

5.管道的特点

(1)管道必须读,写进程同时open,否则会阻塞;

(2)如果管道中没有数据,那么read就会阻塞;

(3)管道的写端关闭,读read返回值为0

(4)管道打开的时候只有只读和只写方式,读写方式是未定义的;

6.循环写读

代码:

a.c

#include <string.h>
#include <assert.h>
#include <fcntl.h>
int main()
{
	int fd = open("fifi", O_WRONLY);
	assert(fd != -1);
	while (1)
	{
		printf("input:\n");
		char buff[128] = { 0 };
		fgets(buff, 128, stdin);
		if (strncmp(buff, "end", 3) == 0)
		{
			break;
		}
		write(fd, buff, strlen(buff));
	}
	close(fd);
}

b.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
#include <fcntl.h>
int main()
{
	int fd = open("./fifi", O_RDONLY);
	assert(fd != -1);
	printf("fd=%d\n", fd);
	while (1)
	{
		char buff[128] = { 0 };
		if (read(fd, buff, 127) == 0)
		{
			break;
		}
		printf("read:%s\n", buff);
	}
	close(fd);
}

结果:

d1db9bed88aa49428945a53da095dedd.png

2.无名管道

1.简介

无名管道,pipe创建无名管道;它只能进行父子间的通信;

使用pipe创建无名管道,只能进行父子间的通信;

pipe是一个系统调用

int pipe(int fds[2]);
//pipe()成功返回 0,失败返回-1
//fds[0]是管道读端的描述符
// fds[1]是管道写端的描述符
//规定

2.代码

父进程写入数据,子进程读取数据;

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
int main()
{
    int fd[2];
	assert(pipe(fd)!=-1);
	pid_t pid=fork();//先open,再frok,父子进程共享打开的文件描述符
	assert(pid!=-1);

    if(pid==0)
	{
		close(fd[1]);
		char buff[128]={0};
		read(fd[0],buff,127);
		printf("child read:%s\n",buff);
		close(fd[0]);
	}
	else
	{
		close(fd[0]);
		write(fd[1],"hello",5);
		close(fd[1]);
	}
	exit(0);
}

4.总体特点

(1)管道必须读,写进程同时open,否则会阻塞;

(2)如果管道没有数据,那么read也会阻塞;

(3)管道的写端关闭,读read返回值为0;

(4)管道打开的时候只有只读和只写两种方式,读写方式打开是未定义的;

(5)管道是半双工的(某一时刻只能选择一个方向)(面试重点)(通信方式有单工,半双工,全双工)

(6)无论有名还是无名,写入管道的数据都在内存中(面试重点)

(7)有名管道和无名管道的区别:有名可以在任意进程间通信,无名主要在父子进程间通信(面试重点)

(8)管道的读端关闭,写会产生异常(发送信号SIGPIPE)(可以改变信号的响应方式验证一下)

25da14432f8947d4a7fd7a810d5fb2aa.png

 验证这个信息,只需要改变信号的响应方式:

#include <signal.h>
void fun(int sig)
{
	printf("sig=%d\n",sig);
}
int main()
{
	signal(SIGPIPE,fun);
	...
}

5.管道实现图

4edce3ce07c349e4a4994cbd3ed7e3da.png

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux--进程间通信、IPC、管道 的相关文章

  • Scrapy FakeUserAgentError:获取浏览器时发生错误

    我使用 Scrapy FakeUserAgent 并在我的 Linux 服务器上不断收到此错误 Traceback most recent call last File usr local lib64 python2 7 site pack
  • 如何查明 Ubuntu 上安装了哪个版本的 GTK+?

    我需要确定 Ubuntu 上安装了哪个版本的 GTK 男人似乎不帮忙 这个建议 https stackoverflow com a 126145 会告诉您安装了哪个 2 0 的次要版本 不同的主要版本将具有不同的包名称 因为它们可以在系统上
  • 如何获取 linux 实用程序 tail 的源代码?

    这个命令确实非常有用 但是我可以在哪里获取源代码以查看内部发生的情况 thanks tail 实用程序是 Linux 上 coreutils 的一部分 源压缩包 ftp ftp gnu org gnu coreutils coreutils
  • gentoo crontab:为什么这个简单的 crontab 不起作用?

    我使用 GENTOO 发行版 crontab e 35 12 root php5 home www cron php 当我手动运行时 php5 php5 home www cron php 这有效 它向我发送了一封电子邮件 然后我检查日期
  • 停止服务时单元陷入故障状态(状态=143)[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这是我的问题 我有 CentOS 和 java 进程在上面运行 Java进程是通过启动 停止脚本来操作的 它也创建了 java 实例的 p
  • 如何在Python中独立于语言安装(linux)获取用户桌面路径

    我找到了 如何找到用户桌面的路径 的几个问题和答案 但在我看来它们都已失效 至少我找到的那些 原因是 如果用户安装的 Linux 不是英语 他或她的桌面很可能位于除 Desktop 例如 对于瑞典语 我相信它是在 Skrivbord 谁知道
  • 在Linux中断上下文中运行用户线程

    我正在编写一些定制的应用程序 并允许更改 Linux 内核中的中断处理程序代码 我有一个用户线程正在等待中断发生 如果发生中断 那么我要做的第一件事就是执行该用户线程 有什么办法让它发挥作用吗 Thanks 创建一个字符设备 这就是内核所做
  • 从多线程程序中调用 system()

    我们正在开发一个用 C 编写的多线程内存消耗应用程序 我们必须执行大量的 shellscript linux 命令 并获取返回码 读完之后article http www linuxprogrammingblog com threads a
  • Docker:处理 tar 文件时出错(退出状态 1):设置枢轴目录时出错:不是目录

    我是 Docker 新手 不知道是什么原因导致此错误或如何诊断它 任何有关此问题的具体帮助或有关首先检查何处以诊断此类问题的提示将不胜感激 我的 Dockerfile FROM java 8 Install maven RUN apt ge
  • 在 /dev/input/eventX 中写入事件需要哪些命令?

    我正在开发一个android需要将触摸事件发送到 dev input eventX 的应用程序 我知道C执行此类操作的代码结构如下 struct input event struct timeval time unsigned short
  • 在 Linux 中禁用历史记录 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 要在 Linux 环境中禁用历史记录 我执行了以下命令 export HISTFILESIZE 0 export HISTSIZE 0 u
  • Godaddy 托管上的 CakePHP 控制台

    我一直在努力让我的 CakePHP 网站在 Godaddy 网格托管 帐户上运行 我的蛋糕应用程序设置是从帐户的子目录托管的 并且可以通过子域访问 我必须调整我的 htaccess 文件才能使其正常工作 现在我需要让 CakePHP 控制台
  • 在Linux上编译C# + WPF以便在Windows上运行

    我有一个 C 应用程序 其中某些部分是使用 WPF 编写的 Mono 不支持 可以在 Linux 上编译这个应用程序吗 最终 该应用程序将在 Windows 上运行 但它是更大框架的一部分 并且我们的整个构建过程在 Linux 上运行 因此
  • ansible 重新启动 2.1.1.0 失败

    我一直在尝试创建一个非常简单的 Ansible 剧本 它将重新启动服务器并等待它回来 我过去在 Ansible 1 9 上有一个可以运行的 但我最近升级到 2 1 1 0 并且失败了 我正在重新启动的主机名为 idm IP 为 192 16
  • 如何修复“iptables:没有该名称的链/目标/匹配”?

    我在我的 Linux 嵌入式系统上构建并安装了 iptables 如果我列出所有规则 则一切正常 iptables list Chain INPUT policy ACCEPT target prot opt source destinat
  • 拆分字符串以仅获取前 5 个字符

    我想去那个地点 var log src ap kernelmodule 10 001 100 但看起来我的代码必须处理 ap kernelmodule 10 002 100 ap kernelmodule 10 003 101 等 我想使用
  • 何时使用 pthread 条件变量?

    线程问题 看来 只有在其他线程调用 pthread cond notify 之前调用 pthread cond wait 时 条件变量才起作用 如果在等待之前发生通知 那么等待将被卡住 我的问题是 什么时候应该使用条件变量 调度程序可以抢占
  • 修改linux下的路径

    虽然我认为我已经接近 Linux 专业人士 但显然我仍然是一个初学者 当我登录服务器时 我需要使用最新版本的R 统计软件 R 安装在 2 个地方 当我运行以下命令时 which R I get usr bin R 进而 R version
  • 使用 find - 删除除任何一个之外的所有文件/目录(在 Linux 中)

    如果我们想删除我们使用的所有文件和目录 rm rf 但是 如果我希望一次性删除除一个特定文件之外的所有文件和目录怎么办 有什么命令可以做到这一点吗 rm rf 可以轻松地一次性删除 甚至可以删除我最喜欢的文件 目录 提前致谢 find ht
  • awk 子串单个字符

    这是columns txt aaa bbb 3 ccc ddd 2 eee fff 1 3 3 g 3 hhh i jjj 3 kkk ll 3 mm nn oo 3 我可以找到第二列以 b 开头的行 awk if substr 2 1 1

随机推荐

  • Leetcode No. 136. Single Number

    Given an array of integers every element appears twice except for one Find that single one Note Your algorithm should ha
  • 面试官:你对Kafka了解吗?这41个问题你能答出几个

    一 请说明什么是Apache Kafka Apache Kafka是由Apache开发的一种发布订阅消息系统 它是一个分布式的 分区的和重复的日志服务 二 请说明什么是传统的消息传递方法 传统的消息传递方法包括两种 排队 在队列中 一组用户
  • 微信小程序真机调试实现获取本地服务器数据

    一般来说 如果不涉及到后端数据 我们通过微信小成开发工具预览功能是可以直观看到项目的情况的 但是一旦涉及到后端本地服务器数据 预览是无法获取到的 而真机调试得按下面操作才能实现 通过win r 打开命令行工具 输入ipconfig 如果你是
  • 关于RT-Thread中优先级翻转问题的简记

    最近在学习RT Thread的相关知识 记录一下心得 优先级翻转 是指当一个高优先级线程试图通过信号量机制访问共享资源时 如果该信号量已被低优先级线程持有 而这个低优先级线程在运行过程中可能又被其他一些中等优先级的线程抢占 从而造成高优先级
  • python-opencv 调取摄像头并保存图片

    通过opencv python 调用摄像头并保存图片 import torch coding utf 8 import numpy as np import cv2 import matplotlib pyplot as plt cap c
  • Hadoop(部署篇)

    目录 Hadoop三种运行模式 本地运行模式 伪分布式运行模式 完全分布式运行模式 开发重点 Hadoop三种运行模式 Hadoop 运行模式包括 本地模式 伪分布式模式以及完全分布式模式 Hadoop 官方网站 http hadoop a
  • this指针

    文章目录 this指针 this指针的引出 this指针的特性 this指针的样子 this指针能空吗 this指针 this指针的引出 首先我们来看一下下面这段简单的代码 include
  • 推拉模式

    推 push 模式是一种基于客户器 服务器机制 由服务器主动将信息送到客户器的技术 联想一下木马的端口反弹技术 在push模式应用中 服务器把信息送给客户器之前 并没有明显的客户请求 push事务由服务器发起 push模式可以让信息主动 快
  • 手机连电脑USB选择MTP连接方式,并解决没有MTP选项的问题

    MTP全称是 Media Transfer Protocol 中文译作 文件传输 usb选择MTP的一般步骤 手机连电脑 usb连接方式选择MTP 如果没有MTP 选择 File Transfer或文件传输或设备文件管理 即为打开usb的M
  • React:非受控组件&ref

    非受控组件 在受控组件中 表单数据由react处理 让表单数据由dom处理 就是非受控组件 使用ref从DOM中获取表单数据 点击按钮 Input输入框获得焦点 import React from react class H extends
  • 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接

    启动服务失败 报错信息 com microsoft sqlserver jdbc SQLServerException 驱动程序无法通过使用安全套接字层 SSL 加密与 SQL Server 建立安全连接 错误 sun security v
  • IDEA 代码质量规范插件SonarLint

    IDEA 安装SonarLint插件 1 打开setting 找到Plugins选项 安装SonarLint 插件 如果有就跳过这一步 检索 SonarLint 安装成功后 重新启动IDEA编辑器 2 使用SonarLint 手动检测类文件
  • linux部署web服务器-Nginx

    linux部署web服务器 Nginx 前言 有很多小伙伴想要建立一个自己的web站点 今天就给大家演示一下 准备工作 1 Nginx安装包 2 Linux服务器 3 PCRE安装包 4 手 方式一 手动编译安装 1 安装编译库 yum y
  • jpa利用Specification实现多条件查询排序

    Entity实体类 import java time Instant import javax persistence Column import javax persistence Entity import javax persiste
  • js大纲(流程控制语句对象,函数,数组等)

    一 运算符 1 逻辑运算符 非运算 与运算 像爱情 或运算 像亲情 2 赋值运算符 3 关系运算符 gt gt lt lt 非数值比较时先转换为数字再比较 比较字符串中字符的Unicode编码 4 相等运算符 5 条件运算符也叫三元运算符
  • 操作系统知识点总结(四)进程同步和临界区互斥问题

    一 进程同步的基本概念 临界资源 同步和互斥 在多道程序环境下 进程是并发执行的 不同进程之间存在着不同的相互制约关系 为了协调进程之间的相互制约关系 引入了进程同步的概念 临界资源 虽然多个进程可以共享系统中的各种资源 但其中许多资源一次
  • FPGA学习记录:第28章 VGA显示器驱动设计与验证

    硬件平台 Cyclone IV E EP4CE10F17C8 开发平台 Quartus II 64 Bit Version 13 0 1 Build 232 06 12 2013 SP 1 SJ Full Version 开发板 野火征途p
  • Android——使用ListView显示信息列表

    1 理解ListView的基础使用 1 作用 Android系统中显示列表的控件 2 两种适配器 ArrayAdapter SimpleAdapter 1 数据适配器 作用 把复杂的数据 数组 链表 数据库 集合等 填充在指定视图界面上 是
  • xp系统一直跳出宽带连接服务器,电脑开机后会自动弹出自动宽带连接提示窗口 怎么关闭?...

    自从电脑接宽带后 我们经常会用到宽带连接 甚至为了方便操作 我们直接让电脑开机就自动宽带连接了 而当我们接上路由后 我们会发现电脑再也不用宽带连接了 而这时电脑由于之前被我们设置为开机自动宽带连接 而导致经常会弹出提示窗口 那我们该如何去关
  • Linux--进程间通信、IPC、管道

    目录 1 进程间通信的方法 2 IPC机制 1 有命管道 1 简介 5 管道的特点 6 循环写读 2 无名管道 1 简介 2 代码 4 总体特点 5 管道实现图 1 进程间通信的方法 1 管道 2 信号量 3 共享内存 4 消息队列 5 套