linux多进程基础(4):进程间通信--无名管道pipe()函数

Linux Socket + pthread + pipe 实现socket通信和多线程数据共享 Linux Socket + pthread + pipe 实现socket通信和多线程数据共享 大道至简,基础的东西不能忘,对于网路时代,开发应该都跑不了socket,作为一个基本功,也好久没写写,简单了一个复习下。主要目标复习下socket的同时,复习下linux多线程处理 涉及知识点: 1,socket 2,linux pthread使用 3,信号量(semaphore)、锁(mutex)、管道pipe)、条件 更多知识点,百度应该比较多了。 代码逻辑: 1,server:最大支持10个链接,当收到 阅读详情

前文已经将如何创建多进程和如何回收子进程资源进行了详细的分析,在这篇文章中,我与大家一起分享进程间的通信.

在Linux中,pipe()函数用于创建一个管道,以便进程之间可以相互通信,值得强调的是,pipe()函数创建的是无名管道,无名管道主要用于父子进程之间的通信,数据只能在一个方向上流动,若双方建立通信,需要建立起两个管道。

1.pipe()函数

要使用pipe()函数,需要包含头文件:

 #include <unistd.h>

pipe()函数定义如下:

int pipe(int filedes[2]);

其中filedes是一个整数数组,用于存储两个文件描述符。filedes[0]是读端文件描述符,filedes[1]是写端文件描述符。

2.举例

 先描述代码的主要思路,创建无名管道并创建两个进程,子进程循环4次给父进程发送数据,父进程接收并输出数据.

#include <sys/types.h>  
#include <unistd.h>  
#include <iostream>  
#include <sys/wait.h>  
#include <string.h>  
#include <unistd.h> // for sleep  
  
int main() {  
    int pipefd[2];  
    int a = pipe(pipefd);  
    if (a == -1) {  
        perror("pipe");  
        return 1;  
    }  
    pid_t pid = fork();  //一定要在创建管道之后,放到管道创建之前会产生意想不到的错误
    if (pid == 0) { // 子进程  
        char str[] = "hello";  
        int i=1;
        while(i<5){
            write(pipefd[1], str, strlen(str) + 1); // 写入数据到管道,包括结尾的空字符  
            sleep(1); // 等待子进程完成写入操作  
            i++;
        }
    } else if (pid > 0) { // 父进程   
        char mess[1024];  
        int j=1;
        while(j<5){
            int len = read(pipefd[0], mess, sizeof(mess) ); // 从管道读取数据,减去一个字符的空间给空字符  
            std::cout << "父进程" << mess << std::endl; // 输出读取到的数据  
            j++;
        }
        wait(&pid); // 等待子进程结束  
    }   
    return 0; // 返回0表示程序正常结束  
}

运行程序得到结果:

可以看到,我们成功实现了父子进程之间的通信!

Linux 高级编程 - 无名管道 Pipe 阅读详情

相关推荐

防反接电路、防倒灌电路、过流保护和ESP相关知识

1.开关电源给负载供电, 如果负载是电池或者其他感性负载(比如像 电机 有线圈 当电源突然断掉时 会产生感应电动势)时, 当220V断掉的时候,可能会出现 电池反向给开关电源 的 输出端 供电,导致开关电源的一些莫名损坏。2.系统在不同的 输出电压 之间 切换时,会存在高压电压倒灌到低压电压源中。例如:系统 有两个电源供电 比如 一个电池 一个 充电器 充电器的电压一般会高于电池 如果没有防倒灌的电路 可能充电器的电压会直接倒灌给电池 造成电池的损坏。

a_black_的博客 1万+

Linux系统调用之pipe函数

如果,想要深入的学习Linux系统调用函数pipe了话,还是需要去阅读Linux系统中的帮助文档的。具体输入命令:man 2 pipe即可查阅到完整的资料信息。

weixin_49503250的博客 4218

ubuntu20 安装px4、mavros、QGroundControl

首先安装一下ant,否则没法运行,同时因20.04的缺少动态库libawt_xawt.so无法被Java8给调用,我的解决办法是去18.04把18.04的相同路径下的动态库libawt_xawt.so移动到20.04的/usr/lib/jvm/java-11-openjdk-amd64/lib/路径中。用rosdepc的时候,你得确保你用的是鱼香ROS的提供的ROS安装方法,否则是没有rosdepc的。make px4_sitl gazebo之前,可以安装一下gazebo的 模型。二、安装MAVROS。

qq_58060770的博客 3284

pipe()函数详解

管道概述 管道也叫无名管道,它是UNIX系统IPC(进程间通信)的最古老形式,所有的UNIX系统都支持这种机制。 无名管道特点 1.半双工,数据在同一时刻只能在一个方向上流动 2.数据只能从管道的一端写入,从另一端读出 3.写入管道的数据遵循先入先从出的规则 4.管道所传送的数据不是无格式的,这要求管道的读出方和写入方必须约定好数据的格式,如多少字节算一个消息 5.管道不是普通的文件,不属于某个文件系统,其只存在于内存中 6.管道在内存中对应一个缓冲区,不同的系统其大小不一定相同 7.从管道读数据是一次性操

Orange的博客 1万+

Linux pipe函数

Linux pipe函数

hddghhfd的博客 792

Linux下的pipe函数详解

pipe函数

威桑的博客 1208

Linux进程间通信】二、pipe管道

Linux进程间通信方式之管道pipe,更多Linux文章请关注专栏《Linux从小白到大神》。

仅以此博客记录日常学习工作中所思所得,水平有限,难登大雅,万望海涵。 3575

Linux系统编程之进程间通信--管道pipe()函数详解

本文主要介绍了Linux编程中进程间通信方式中的管道,内容包括管道的原理、作用,pipe()函数的使用以及注意事项等。通过图文和代码相结合的方式帮助大家更好地理解管道这一概念,以及如何更好更合理地去使用管道,希望能够对大家有所帮助。如文章有出现错误的地方,欢迎大家扶正错误,同时也欢迎大家多多提一些建议。

m0_68208233的博客 2770

Linux进程通信之无名管道PIPE)和有名管道(FIFO)

进程间通信是什么? 进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。简单说就是进程之间可以相互发送数据。 今天我们介绍管道:包括无名管道PIPE)和有名管道(FIFO)。 无名管道PIPE管道通常指无名管道,是 UNIX 系统IPC最古老的形式。 无名管道具有如下几个性质: 特点有: 1、它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。 2、它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间),实现依赖父

年年年的博客 5883

管道-pipe()函数使用

进程间通信 linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间。任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能相互访问,要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Communication)。 进程间通信的方式 在进程间完成数据传递需要借助操作系统提供特殊的方法,如:文件、管道、信号、共享内存、消息队列、套接字、命名管道

weixin_46211877的博客 2590

无名管道无名管道Pipe)与进程通信:快速上手

无名管道是一种强大且基础进程间通信机制,它使得具有亲缘关系的进程之间能够方便地共享数据。无名管道的使用,无论是在简单的Shell命令,还是在复杂的多进程应用中,都有着广泛的应用。 注意:无名管道只能在具有公共祖先的进程之间使用,且只能实现单向通信。

crr411422的博客 1466

无名管道pipe()

Linux 进程间通信方式主要有下面 6 种: 1. 管道 和命名管道管道(无名管道) 有亲缘关系进程间的通信,命名管道还允许无亲缘关系进程间通信 2. 信号 signal:在软件层模拟中断机制,通知进程某事发生 3. 消息队列:消息的链表包括 posix 消息队列和 SystemV 消息队列 4. 共享内存:多个进程访问一块内存主要用于同步 5. 信号量:进程间同步 6. 套接字 socket...

机器人007的博客 443

Linux进程间通信无名管道(PIPE)

每个进程各自有不同的用户地址空间,任 何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲 区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Communication) 无名管道PIPE只适用于父子进程间的通信,还有一种叫做有名管道

my9074的专栏 1912

有名管道无名管道

1.  (1)数据传输     一个进程需要将它的数据发送给另一个进程 (2)资源共享     多个进程之间共享同样的资源 (3)通知事件     一个进程需要向另一个或一组进程发送消息,通知它们发生了某种事件 (4)进程控制     有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有操作,并能够及时知道它的状态改变 2.发展 L

zm1_1zm 1万+

linux编程之pipe()函数

转自:https://www.cnblogs.com/kunhu/p/3608109.html

铁头娃 3354

pipe函数详解

pipe函数可用于创建一个管道,以实现进程间的通信。pipe函数的定义如下: pipe函数定义中的fd参数是一个大小为2的一个数组类型的指针。该函数成功时返回0,并将一对打开的文件描述符值填入fd参数指向的数组。失败时返回 -1并设置errno。 通过pipe函数创建的这两个文件描述符 fd[0] 和 fd[1] 分别构成管道的两端,往 fd[1] 写入的数据可以从 fd[0] 读出。并且 fd[1] 一端只能进行写操作,fd[0] 一端只能进行读操作,不能反过来使用。要实

judgejames的博客 4万+

pipe()函数

当我们需要在两个进程之间进行通信时,可以使用管道pipe)来实现。管道是一种特殊的文件,具有一个读取端和一个写入端。它可以用于在父进程和子进程之间传递数据。函数会创建一个管道,并将读取端和写入端的文件描述符存储在。我们可以使用这些文件描述符进行读取和写入操作。是一个包含两个整数的数组,用于存储管道的文件描述符。函数来创建一个管道。以下是一个简单的例子,展示了如何使用。在C语言中,可以使用。

qq_66111476的博客 1023

Linux中的高级IO函数(一)pipe & socketpair & dup

Linux提供了很多高级的I/O函数。它们并不像Linux基础I/O函数(比如open和read)那么常用(编写内核模块时一般要实现这些I/O函数),但在特定的条件下却表现出优秀的性能。这些函数大致分为三类:用于创建文件描述符的函数,包括pipe、socketpair、dup/dup2函数。用于读写数据的函数,包括readv/writev、sendfile、mmap/munmap、splice和tee函数。用于控制I/O行为和属性的函数,包括fcntl函数。本节先介绍第一类。

Lyajpunov的博客 1151

管道通信原理

无名管道: 1.管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道;只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程)。 单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中。 数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据。 2.管道的创建 由pipe()函数创建 函数

weixin_46539107的博客 2425

linux_管道学习-pipe函数-管道的读写-fpathconf函数

管道是一种最基本的IPC机制,作用于有血缘关系的进程之间,完成数据传递。调用pipe系统函数即可创建一个管道。int pipe(int pipefd[2]); 创建一个管道。① 读管道: 1. 管道中有数据,read返回实际读到的字节数。2. 管道中无数据:管道写端被全部关闭,read返回0 (好像读到文件结尾) 写端没有全部被关闭,read阻塞等待(不久的将来可能有数据递达,此时会让出cpu)管道管道读端全部被关闭, 进程异常终止(也可使用捕捉SIGPIPE信号,使进程不终止) 管道读端没有全部

qq_44177918的博客 1650

上市公司-信息透明度综合指数数据(2003-2023年).zip

上市公司-信息透明度综合指数数据(2003-2023年)

上一篇: linux多进程基础(3):waitpid()函数
下一篇: linux多进程基础(5):有名管道(fifo)
shnhe
博客等级 码龄5年 314粉丝 45原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值