linux学习笔记(12)-进程间通信|管道

波子木木 波子木木     2022-08-14     472

关键词:

 

  Linux的进程间通信有几种方式,包括,管道,信号,信号灯,共享内存,消息队列和套接字等……

  现在一个个的开始学习!

  ——————————————————————————————————————————————————

  管道是一个进程链接另一个进程的数据通道,它通常是把一个进程的输出,接到另一个进程的输入,从而传递数据。

  在Linux的终端上,用单竖线|来表示,那么,这个符号可以做什么呢?

  举个栗子,如果我用ps -ef命令,可以查看我当前所有的进程:

  

  正如上图表示,显示出来的东西太多了,让人眼花缭乱,如果想在其中找到自己想要的进程,比如看看sshd服务是否启动了,那绝对会找到我吐血。

  换一种方式,如果使用管道那就简单多了……

  首先,用ps -ef命令后,他的输出就是一大堆的进程列表,我用这个输出,作为别的命令的输入,比如grep命令,那么就能轻易找到自己想要的进程。

  ps -ef|grep sshd

  下面来试试……

  

  这样就很明显的看出,已经把进程中,拥有关键字sshd的进程给筛选了出来,而且还涂上了红色。一目了然,我的sshd服务已经启动了。

————————————————————————————————————————————————————————————————————————

  管道分为匿名管道命名管道两种,匿名管道主要用在两个拥有血缘关系的进程间通信,比如父子,爷孙……

  而命名管道主要用在两个陌生进程之间的通信。

  匿名管道是一种半双工管道,半双工就意味这,他在同一时间内,只能进程送信或者受信的一种,无法同时进行。

  

  管道这个功能,如果表现在程序中,那么需要用到下面这个函数:

  int pipe(int pipefd[2])

  其中参数pipefd[2]是一个文件描述符性质的数组,代表打开管道的两端,其中pipefd[0]为读入,pipefd[1]为写入

  现在写个程序,父进程使用管道向子进程发送一个信号,子进程收到后,在返回一个信号。

  因为一点小错误,这个程序写了将近一个小时……

  重点:管道的读取read和写入write,这两个函数都是阻塞操作的!

  重点中的重点:一定要在进程创立之前,建立好管道。

  重点中的重点中的重点:匿名管道是半双工,在通信开始前,一定要先关闭不需要的通道,在通信结束后,一定也要执行关闭。

  在匿名管道中,读进程和写进程初始都会拥有[0],[1],两个描述符各自一套,写程序时一定要注意在写处理里面 close(pi[0]),在读进程里面 close(pi[1]),在写进程写任务执行完之后务必 close(pi[1]),读进程读完之后务必 close(pi[0])。

  否则将会出现无限阻塞的问题,关于这个问题,害得我花费了一个小时……

  疑问:当一个匿名管道关闭之后,能不能再次重新打开呢?比如说用open(pi2[1])之后,在继续发送数据呢?

      我在网上找了好久,但没有看见这方面的描述,我感觉,这匿名管道总不能是一次性的吧?如果真是那样,那也太奢侈了!!

#include<sys/wait.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>

int main(int argc, char *argv)
{
    int pi1[2];
    int pi2[2];
    pid_t pid_test;
    char buff[100];
    char buff2[100]={"儿子:你好,我是儿子!"};
    char buff1[100]= {"老子:你好,我是老子!"};

    if (pipe(pi1)== -1)
    {
        printf("管道1号创建失败!\n");
        exit(0);
    }
    if (pipe(pi2) == -1)
    {
        printf("创建2号管道失败!\n");
    }
    pid_test = fork();
    if (pid_test < 0)
    {
        printf("创建子进程失败!\n");
        exit(0);
    }
    if (pid_test == 0)
    {
        printf("我是儿子,名叫:%d,我爹是:%d\n",getpid(),getppid());
        write(STDOUT_FILENO,"\n",1);
        close(pi1[1]);
        while(read(pi1[0],buff,1) > 0)
        {
            write(STDOUT_FILENO,buff,1);
        }
        write(STDOUT_FILENO,"\n",1);
        close(pi1[0]);
        printf("儿子读完了!\n");
        printf("儿子读完了!\n");
        sleep(2);
        close(pi2[0]);
        write(pi2[1],buff2,strlen(buff2));
        close(pi2[1]);
        printf("儿子写完了!\n");
        exit(EXIT_SUCCESS);
        exit(0);
    }
    else
    {
        printf("我是爹!我的ID是:%d,我儿子的ID是:%d\n",getpid(),pid_test);
        sleep(2);
        close(pi1[0]);
        write(pi1[1],buff1,strlen(buff1));
        close(pi1[1]);
        printf("老子写完了!\n");
        close(pi2[1]);
        while(read(pi2[0],buff,1) > 0)
        {
            write(STDOUT_FILENO,buff,1);

        }
        write(STDOUT_FILENO,"\n",1);
        printf("老子读完了!\n");
        close(pi2[0]);
        wait(NULL);
        exit(0);
    }

    return 0;
}

  代码执行的结果如下:

   程序OK了!!

  

  今天,太累了!

 

linux学习:进程间通信—管道

1、进程间通信当中一种比較简单的方法是管道操作/*============================================================================Name:Test.cAuthor:wangchuanVersion:Copyright:YourcopyrightnoticeDescription:HelloWorldinC,Ansi-styl 查看详情

[linux]进程间通信介绍管道

0.进程间通信介绍0.1通信背景在之前我们学习进程时知道进程具有独立性,所以进程间交互数据的成本就变得非常高。进程之间为什么也进行进程间通信,这就需要谈谈进程间通信的目的了。但是进程具有独立性不是彻底独立,... 查看详情

linux学习进程间通信——匿名管道|命名管道(代码片段)

🐱作者:一只大喵咪1201🐱专栏:《Linux学习》🔥格言:你只管努力,剩下的交给时间!从今天开始,Linux的代码就切换在VScode上写了,总算告别VIM了,而且编程语言也开始使用C++... 查看详情

linux进程间通信(代码片段)

文章目录进程间通信介绍进程间通信的概念进程间通信的目的进程间通信的本质进程间通信的分类管道什么是管道匿名管道匿名管道的原理pipe函数匿名管道使用步骤管道读写规则管道的特点管道的四种特殊情况管道的大小命名... 查看详情

linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存

...LinuxC程序设计大全》,《unix环境高级编程》参考:C和指针学习 说明:本文非常的长,也是为了便于查找和比较,所以放在一起了  Linux传统的进程间通信有很多,如各类管道、消息队列、内存共享、信号量等等。但它... 查看详情

linux入门进程间的通信(代码片段)

进程间通信进程间通信介绍进程间通信目的进程间通信发展进程间通信分类管道什么是管道匿名管道用fork来共享管道的原理站在内核角度-深度理解管道站在内核角度-管道的本质管道读写规则管道特点命名管道创建一个命名管道... 查看详情

linux系统进程间通信方式:管道

本文详细介绍了匿名管道和有名管道这两个用于进程间通信的方式,并总结了他们的特点和使用场景;也通过示例演示了两个进程如何通过管道进行通信。本文详细介绍了匿名管道和有名管道这两个用于进程间通信的方式,并总... 查看详情

linux-进程间通信(代码片段)

进程间通信进程间通信介绍进程间通信目的进程间通信发展进程间通信分类管道匿名管道匿名管道特点匿名管道读写规则命名管道创建一个命名管道命名管道的打开规则用命名管道实现server&client通信systemV共享内存共享内存共... 查看详情

linux-进程间通信(代码片段)

进程间通信进程间通信介绍进程间通信目的进程间通信发展进程间通信分类管道匿名管道匿名管道特点匿名管道读写规则命名管道创建一个命名管道命名管道的打开规则用命名管道实现server&client通信systemV共享内存共享内存共... 查看详情

c++笔记--linux编程(11)-进程通信(代码片段)

无名管道无名管道        无名管道是半双工的,就是对于一个管道来讲,只能读,或者写。        无名管道只能在相关的、有共同祖先的进程间使用。        一个fork或者exec调用创建的子进程继承了父... 查看详情

进程间通信(代码片段)

...求在哪里实验八、进程间通信学号-姓名18043104-邝欢作业学习目标1、了解进程间通信的常用方式;2、掌握管道、消息队列、信号量、共享内存实现进程间通信的方法。1.举例说明使用匿名管道进行进程通信。管道通信匿名管道当... 查看详情

进程间通信

...在哪里实验八、进程间通信学号-姓名18041513-夏弘昊作业学习目标(1)了解进程间通信的常用方式(2)掌握管道、消息队列、信号量、共享内存实现进程间通信的方法。实验内容1.举例说明使用匿名管道进行进程通信。例:父进... 查看详情

实验8进程间通信

...作业的要求在哪里作业要求学号-姓名18043121-魏建鹏作业学习目标1.了解进程间通信的常用方式;2.掌握管道、消息队列、信号量、共享内存实现进程间通信的方法。1.举例说明使用匿名管道进行进程通信。2.举例说明使用mkfifo命令... 查看详情

linux之进程间通信——管道

目录进程间是怎么通信的管道匿名管道匿名管道是如何实现进程间通信内核角度理解匿名管道管道的读写规则 情景1情景2 情景3​ 情景4命名管道创建命名管道命令行方式创建函数创建命名管道的应用场景 场景1 场景2场景3进... 查看详情

实验八进程间通信

...业的要求在哪里实验八要求学号-姓名18043210-张银杰作业学习目标1、了解进程间通信的常用方式;2、掌握管道、消息队列、信号量、共享内存实现进程间通信的方法。1.举例说明使用匿名管道进行进程通信。管道通信匿名管道当... 查看详情

linux之进程间通信(代码片段)

进程间通信文章目录进程间通信进程间通信的目的进程间通信分类管道什么是管道匿名管道pipe函数用fork来共享管道原理站在文件描述符角度理解管道管道读写规则管道的特性命名管道systemV共享内存共享内存的基本原理申请共享... 查看详情

[os-linux]详解linux的进程间通信1------管道(代码片段)

本文详解了Linux中进程间通信,包括了进程间通信的介绍,匿名管道和命名管道。目录一、进程间通信的介绍1.进程间通信目的2.进程间通信分类二、管道1.管道是什么2.匿名管道  (1)pipe (2)实现 (3)用... 查看详情

[os-linux]详解linux的进程间通信1------管道(代码片段)

本文详解了Linux中进程间通信,包括了进程间通信的介绍,匿名管道和命名管道。目录一、进程间通信的介绍1.进程间通信目的2.进程间通信分类二、管道1.管道是什么2.匿名管道  (1)pipe (2)实现 (3)用... 查看详情