【Linux】进程通信之匿名管道通信

简介: 【Linux】进程通信之匿名管道通信

一、进程间进行通信的目的

我们往往需要多个进程协同,共同完成一些事情。

  • 数据传输:一个进程需要将它的数据发送给另一个进程
  • 资源共享:多个进程之间共享同样的资源。
  • 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止 时要通知父进程)。
  • 进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另 一个进程的所有陷入和异常,并能够及时知道它的状态改变

       进程间通信的本质:要让不同的进程看到同一份资源,这份资源一般是由操作系统提供的。操作系统提供的资源不同,就决定了有不同的通信方式

二、管道通信

2.1、匿名管道通信的原理

       基于文件的方式,让不同进程看到同一份资源的通信方式,叫做管道,管道通信只能为单向通信如果今天我们让父进程以读和写两种方式打开同一个文件,操作系统是会为我们创建两个struct file结构体的,只不过这两个struct file结构体的缓冲区是同一个。如果我们让这个父进程创建一个子进程,子进程的PCB和文件描述符表和父进程一模一样,所以此时子进程也是以读和写两种方式打开了父进程打开的这个文件。这样操作就让父子进程看到了同一份资源。也就是说struct file对象是允许多个进程通过指针指向它的

       前面也说过,管道通信为单向通信,所以如果想让父进程写子进程读,就关闭父进程的读端关闭子进程的写端,反之亦然。

2.2、pipe系统调用函数

      pipe可以帮我们创建一个不需要向磁盘刷新且磁盘中并不存在的文件,也就是管道。这是一个内存级的文件,是匿名文件或叫匿名管道。匿名管道只能让具有血缘关系的进程进行进程通信,常用于父子进程之间进行进程通信

2.3、匿名管道通信的简单实现

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
 
 
 
void writer(int wfd)
{
    char buffer[128];
    int count = 0;
    while (1)
    {
        snprintf(buffer, sizeof(buffer), "I am your child!, pid:%d, count:%d\n", getpid(), count++);
        write(wfd, buffer, strlen(buffer));
        sleep(1);
    }
    
   
}
 
void reader(int rfd)
{
    char buffer[128];
   while (1)
   {
        read(rfd, buffer, sizeof(buffer));
        printf("father get message:%s", buffer);
   }
   
}
 
int main()
{
    int pipefd[2];
    int n = pipe(pipefd);
 
    int fd = fork();
    if(fd == 0)
    {
        //子进程充当写端,从而关闭读端
        close(pipefd[0]);
        writer(pipefd[1]);
        exit(0);
    }
 
    //父进程充当读端,从而关闭写端
    close(pipefd[1]);
    reader(pipefd[0]);
    wait(NULL);
    return 0;
}

父进程不断读到从子进程发来的消息:

相关文章
|
2天前
|
存储 Linux Shell
Linux进程概念(上)
冯·诺依曼体系结构概述,包括存储程序概念,程序控制及五大组件(运算器、控制器、存储器、输入设备、输出设备)。程序和数据混合存储,通过内存执行指令。现代计算机以此为基础,但面临速度瓶颈问题,如缓存层次结构解决内存访问速度问题。操作系统作为核心管理软件,负责资源分配,包括进程、内存、文件和驱动管理。进程是程序执行实例,拥有进程控制块(PCB),如Linux中的task_struct。创建和管理进程涉及系统调用,如fork()用于创建新进程。
15 3
Linux进程概念(上)
|
2天前
|
缓存 监控 安全
Linux top命令详解:持续监听进程运行状态
Linux top命令详解:持续监听进程运行状态
14 3
|
3天前
|
监控 Linux Shell
探索Linux命令nice:优雅地调整进程优先级
`nice`命令在Linux中用于调整进程优先级,影响资源分配。它允许设置-20到19的nice值,数值越低,优先级越高。在数据处理时,使用`nice`可控制任务优先级,避免占用全部CPU资源。例如,`nice -n 10 command`以低优先级启动`command`。注意不要过度使用,应根据系统负载和需求谨慎调整。使用`renice`可改变已运行进程的优先级,生产环境操作需谨慎。
|
7天前
|
Linux 数据处理
深入了解Linux命令kill:终止进程的艺术
**Linux的`kill`命令详解:高效管理进程的工具** `kill`命令在Linux中用于向进程发送信号,如SIGTERM(默认)和SIGKILL,以终止或影响进程行为。它通过进程ID(PID)操作,支持多种信号和选项,如`-l`列出信号,`-9`强制杀进程。例如,`kill 1234`发送TERM信号,`kill -9 1234`发送KILL信号。使用时注意,SIGKILL是不可忽视的,可能导致数据丢失。配合`pgrep`和`pkill`能更灵活管理进程。了解进程依赖和使用其他命令如`ps`和`top`可优化系统资源管理。
|
4天前
|
监控 Linux 程序员
linux查看进程
linux查看进程
|
5天前
|
算法 Linux Shell
c++高级篇(一) —— 初识Linux下的进程控制
c++高级篇(一) —— 初识Linux下的进程控制
|
17天前
|
消息中间件 存储 缓存
【嵌入式软件工程师面经】Linux系统编程(线程进程)
【嵌入式软件工程师面经】Linux系统编程(线程进程)
30 1
|
10天前
|
Linux Shell 调度
Linux进程——Linux下常见的进程状态
Linux进程——Linux下常见的进程状态
20 4
|
10天前
|
Linux Shell 编译器
Linux进程——Linux环境变量
Linux进程——Linux环境变量
11 3

热门文章

最新文章