网络编程之 进程间的通信之管道的使用

简介: 如何使用管道是进程间通信的关键博主先声明一下,关于处理进程创建以及销毁的方法。 “子进程究竟何时终止????调用waitpid函数后还要无休止的等待子进程终止吗???”,这显然会是一个问题。因为父进程往往与子进程一样繁忙,因此我们不能只调用waitpid函数来等待子进程终止。那么我们应该怎么办呢???

如何使用管道是进程间通信的关键

博主先声明一下,关于处理进程创建以及销毁的方法。

   “子进程究竟何时终止????调用waitpid函数后还要无休止的等待子进程终止吗???”,这显然会是一个问题。因为父进程往往与子进程一样繁忙,因此我们不能只调用waitpid函数来等待子进程终止。那么我们应该怎么办呢???

     这就要涉及到我们后面要了解的内容了,信号的概念,我们可以制作信号捕捉器,来完美解决这个问题,由于信号的知识点较多也比较复杂所以博主将往后推移了。


                   那我们就开始吧!!

如何理解进程间通信

     进程 通信意味着两个不同进程间可以交换数据,为了完成这一点,操作系统中应提供两个进程可以同时访问的内存空间(我们也叫缓冲区。)

我们先看一下比较专业的解答吧。

     Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间。任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能相互访问,要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信。

     其实就是进程一旦创建完成它就拥有完全独立的内存结构(0到4G的空间pcb控制块等等),就连通过 fork()创建的子进程也不会与父进程共享内存空间。因此我们就必须想想其他的办法完成进程间的通信了。只要有两个进程由可以同时访问的内存空间,那么进程间就可以通过此空间进行数据交换了。----------->这就是进程间通信。

那么如何实现我们上面所说的呢??这似乎也是一件麻烦事啊????

博主在这里唠叨一句下面的方法都能实现进程间通信,但是展开说实在太费篇幅,博主就简单提一提,如果有感兴趣的朋友可以去查一下相关的资料。


         在进程间完成数据传递需要借助操作系统提供特殊的方法,如:文件、管道、信号、共享内存、消息队列、套接字、命名管道等。随着计算机的蓬勃发展,一些方法由于自身设计缺陷被淘汰或者弃用。现今常用的进程间通信方式有:

① 管道 (使用最简单)

② 信号 (开销最小)

③ 共享映射区 (无血缘关系)

④ 本地套接字 (最稳定)


管道是什么?

管道是什么?

           既然我们要用到管道的话,那我们就先来聊一聊什么是管道吧。


IPC:下面给出百度百科的解释

20191028194044675.png

管道是一种最基本的IPC机制,作用于有血缘关系的进程之间,完成数据传递。调用pipe系统函数即可创建一个管道。有如下特质:

1. 其本质是一个伪文件(实为内核缓冲区)

2. 由两个文件描述符引用,一个表示读端,一个表示写端。

3. 规定数据从管道的写端流入管道,从读端流出。

管道的原理: 管道实为内核使用环形队列机制,借助内核缓冲区(4k)实现。

管道的局限性:

① 数据自己读不能自己写。

② 数据一旦被读走,便不在管道中存在,不可反复读取。

③ 由于管道采用半双工通信方式。因此,数据只能在一个方向上流动。(这就是半双工通信。)

④ 只能在有公共祖先的进程间使用管道。

(希望大家能记住上面的,还是比较重要的。)


给出管道的模型:

20191028194617321.png

通过上图我们可以看到,为了完成进程间通信(因为进程间的通信不能直接完成,所以我们不得不使用管道),我们需要创建管道。管道不属于进程的资源。而是和套接字一样,属于操作系统(也就不是fork()锁复制的对象)。所以,两个进程之间可以通过操作系统提供的内存空间进行通信。


下面给出创建管道的函数:

#include<unistd.h>
int pipe(int pipefd[2]);
  -->成功:返回 0
     失败:返回 -1

  函数调用成功返回read()/write()两个文件描述符。无需open(),但需手动close()。

         规定:fd[0] → read(); fd[1] → write(),就像0对应标准输入,1对应标准输出一样。向管道文件读写数据其实是在读写内核缓冲区


其实当你要使用管道时,博主在这里可以给你一些使用的小方法来帮助你去理解一些代码.

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#define BUF_SIZE 30
int main(void) {
  int fds[2];//因为你要调用 int pipe(int pipefd[2]) 这个函数所以你需要创建一个 int型的数组
  char str[] = "Who are you?";  //这个是你要写出去的字符串
  char buf[BUF_SIZE]; //用来接收的数组
  pid_t pid;//用来接收 fork()的返回值,来判断 父子进程
  pipe(fds);  //创建管道
  pid = fork(); //创建进程
  if (pid == 0) { //子进程
    write(fds[1], str, sizeof(str));  //将字符串 "Who are you?"写出去
  } else {  //父进程
    read(fds[0], buf, BUF_SIZE)); //将独到的字符串写到 buf数组里面 该数组大小为 BUF_SIZE
    puts(buf);  //输出
  }
  return 0;
}


2019102820241286.png


20191028202430365.png

大家对于管道的理解到这里就行了,鉴于书中还有单管道同时进行读写,这是不推荐使用的。


不推荐这种

20191028202535866.png

博主推荐的是下面这种方式使用管道

20191028202732316.png


为了完成这个模式我们需要使用以下代码:

20191028202812342.png

有了博主上面的讲解大奖看懂这个代码应该是很轻松地了。


目录
相关文章
|
3月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
206 1
|
3月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
235 1
|
12月前
|
消息中间件 存储 网络协议
从零开始掌握进程间通信:管道、信号、消息队列、共享内存大揭秘
本文详细介绍了进程间通信(IPC)的六种主要方式:管道、信号、消息队列、共享内存、信号量和套接字。每种方式都有其特点和适用场景,如管道适用于父子进程间的通信,消息队列能传递结构化数据,共享内存提供高速数据交换,信号量用于同步控制,套接字支持跨网络通信。通过对比和分析,帮助读者理解并选择合适的IPC机制,以提高系统性能和可靠性。
1565 14
|
Ubuntu 网络协议 Unix
02理解网络IO:实现服务与客户端通信
网络IO指客户端与服务端通过网络进行数据收发的过程,常见于微信、QQ等应用。本文详解如何用C语言实现一个支持多客户端连接的TCP服务端,涉及socket编程、线程处理及通信流程,并分析“一消息一线程”模式的优缺点。
357 0
|
11月前
|
canal 编解码 运维
飞天洛神云网络再度入选通信顶会 SIGCOMM'24
飞天洛神云网络再度入选通信顶会 SIGCOMM'24
386 12
|
11月前
|
消息中间件 Linux C++
c++ linux通过实现独立进程之间的通信和传递字符串 demo
的进程间通信机制,适用于父子进程之间的数据传输。希望本文能帮助您更好地理解和应用Linux管道,提升开发效率。 在实际开发中,除了管道,还可以根据具体需求选择消息队列、共享内存、套接字等其他进程间通信方
302 16
|
11月前
|
人工智能 自然语言处理 决策智能
智能体竟能自行组建通信网络,还能自创协议提升通信效率
《一种适用于大型语言模型网络的可扩展通信协议》提出创新协议Agora,解决多智能体系统中的“通信三难困境”,即异构性、通用性和成本问题。Agora通过标准协议、结构化数据和自然语言三种通信格式,实现高效协作,支持复杂任务自动化。演示场景显示其在预订服务和天气预报等应用中的优越性能。论文地址:https://arxiv.org/pdf/2410.11905。
388 6
|
负载均衡 网络协议 算法
不为人知的网络编程(十九):能Ping通,TCP就一定能连接和通信吗?
这网络层就像搭积木一样,上层协议都是基于下层协议搭出来的。不管是ping(用了ICMP协议)还是tcp本质上都是基于网络层IP协议的数据包,而到了物理层,都是二进制01串,都走网卡发出去了。 如果网络环境没发生变化,目的地又一样,那按道理说他们走的网络路径应该是一样的,什么情况下会不同呢? 我们就从路由这个话题聊起吧。
348 4
不为人知的网络编程(十九):能Ping通,TCP就一定能连接和通信吗?
|
11月前
|
缓存 网络协议 安全
即时通讯初学者必知必会的20个网络编程和通信安全知识点
即时通讯IM应用开发的初学者很容易迷失在网络编程的复杂性以及通信安全的各种概念里,本文不涉及深度理论知识,尽量通过一句话或几句话让你快速了解20个相关的网络编程和通信安全知识点,希望能助你愉快地开始即时通讯应用开发。
471 0
|
网络协议
计算机网络与通信
计算机网络基本概念:了解计算机网络的定义、功能、分类和拓扑结构(如总线型、星型、环型、树形、网状等)。 网络通信原理:了解网络通信的基本原理、协议和技术,如TCP/IP协议、网络通信设备等。
252 3

热门文章

最新文章