Linux命名管道进程通信

简介: Linux命名管道进程通信

前言

命名管道 是实现进程间通信的强大工具,它提供了一种简单而有效的方式,允许不同进程之间进行可靠的数据交换。不仅可以在同一主机上的不相关进程间进行通信,还可以在不同主机之间的进程进行网络通信。


一、什么是命名管道通信

命名管道 是一种半双工的通信机制,用于同一主机上的不相关进程之间的通信。它遵循 FIFO的原则,也就是先写入的数据会先被读取。命名管道在文件系统中有一个唯一的路径名,使用时需要先创建管道,然后不同进程通过打开同一个路径名的管道文件来进行通信。

上篇文章中使用 pipe 函数进行通信的也叫做匿名管道。Linux 进程间通信, 管道

pipe 创建的管道 只能用于 “ 有血缘关系 ” 的进程之间。 但是 FIFO 可以允许 不相关的进程间交换数据。

二、创建方式

  1. 命令行创建: mkfifo 管道名。

  2. 库函数: int mkfifo(const char *pathname, mode_t mode);
    返回值:成功返回 0; 失败 返回 -1。

一旦使用 mkfifo 创建一个 FIFO ,就可以使用 open 打开它,常见的 I/O 函数都可用于 fifo 。如: close , read , write , unlink 等。

三、代码示例

下列代码用来 实现 2 个不相关程的通信,一个用来 写数据,一个用来读数据。

首先使用 命令行创建 管道。

写数据进程:

void sys_error(const char *str)
{
  perror(str);
  exit(1);                // 正常退出程序
}
int main(int argc, char **argv)
{
  int fd, i=0, ret;
  char buff[20];
  if(argc <2)             // 输入两个参数:可执行文件,刚刚创建的 fifo 名字
  {
    printf("Usage: ./a.out fifoname\n");
    return -1;
  }
  fd = open(argv[1], O_WRONLY);       // 以只写的方式打开文件
  if(fd < 0)
  {
    sys_error("open error");
  }
  while(1)
  {
    sprintf(buff, "hello : %d\n", i++);
    write(fd, buff, strlen(buff));          // 不断 写入数据
    sleep(1);                   //休眠 1 秒
  }
  close(fd);
  return 0;
}

读数据进程:

void sys_error(const char *str)
{
  perror(str);
  exit(1);                      // 正常终止程序
}
int main(int argc, char **argv)
{
  int fd, i=0, ret;
  char buff[20];
  if(argc <2)
  {
    printf("Usage: ./a.out fifoname\n");        
    return -1;
  }
  fd = open(argv[1], O_RDONLY);           // 以只读的方式打开文件
  if(fd < 0)
  {
    sys_error("open error");
  }
  while(1)
  {
    ret = read(fd, buff, sizeof(buff));       // 读出数据放入 buff
    write(STDOUT_FILENO, buff, ret);        // 见数据写入 标准输出
  }
  close(fd);
  return 0;
}

注意

对于匿名管道(Anonymous Pipe),它只能有一个读端和一个写端。这意味着一般情况下,只能有一个进程从管道中读取数据,而另一个进程则负责向管道中写入数据。

而对于有名管道(Named Pipe),它可以以支持多个读端和多个写端。这使得多个进程能够同时从管道中读取数据或向管道中写入数据。这样可以实现进程间的并发通信。

例如:

可以将上面示例代码加一个读端:

可以看到 1处 读出的数据,在 2处 就读不出了。因为,管道中数据不可反复读取。一旦读走,管道中不在存在

四、文件进程通信

使用 文件也可以完成 IPC ,理论依据是, fork 后,父子线程共享文件描述符。也就打开了共享文件。


总结

进程间通信是操作系统和分布式系统领域的重要内容,深入了解和掌握不同的进程间通信方式对于开发高效可靠的应用程序至关重要。

相关文章
|
20天前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
本文旨在探讨Linux操作系统中的进程管理机制,包括进程的创建、执行、调度和终止等环节。通过对Linux内核中相关模块的分析,揭示其高效的进程管理策略,为开发者提供优化程序性能和资源利用率的参考。
45 1
|
9天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
61 13
|
15天前
|
SQL 运维 监控
南大通用GBase 8a MPP Cluster Linux端SQL进程监控工具
南大通用GBase 8a MPP Cluster Linux端SQL进程监控工具
|
23天前
|
运维 监控 Linux
Linux操作系统的守护进程与服务管理深度剖析####
本文作为一篇技术性文章,旨在深入探讨Linux操作系统中守护进程与服务管理的机制、工具及实践策略。不同于传统的摘要概述,本文将以“守护进程的生命周期”为核心线索,串联起Linux服务管理的各个方面,从守护进程的定义与特性出发,逐步深入到Systemd的工作原理、服务单元文件编写、服务状态管理以及故障排查技巧,为读者呈现一幅Linux服务管理的全景图。 ####
|
6月前
|
监控 Linux 应用服务中间件
探索Linux中的`ps`命令:进程监控与分析的利器
探索Linux中的`ps`命令:进程监控与分析的利器
138 13
|
5月前
|
运维 关系型数据库 MySQL
掌握taskset:优化你的Linux进程,提升系统性能
在多核处理器成为现代计算标准的今天,运维人员和性能调优人员面临着如何有效利用这些处理能力的挑战。优化进程运行的位置不仅可以提高性能,还能更好地管理和分配系统资源。 其中,taskset命令是一个强大的工具,它允许管理员将进程绑定到特定的CPU核心,减少上下文切换的开销,从而提升整体效率。
掌握taskset:优化你的Linux进程,提升系统性能
|
5月前
|
弹性计算 Linux 区块链
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
192 4
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
|
4月前
|
算法 Linux 调度
探索进程调度:Linux内核中的完全公平调度器
【8月更文挑战第2天】在操作系统的心脏——内核中,进程调度算法扮演着至关重要的角色。本文将深入探讨Linux内核中的完全公平调度器(Completely Fair Scheduler, CFS),一个旨在提供公平时间分配给所有进程的调度器。我们将通过代码示例,理解CFS如何管理运行队列、选择下一个运行进程以及如何对实时负载进行响应。文章将揭示CFS的设计哲学,并展示其如何在现代多任务计算环境中实现高效的资源分配。
|
5月前
|
存储 缓存 安全
【Linux】冯诺依曼体系结构与操作系统及其进程
【Linux】冯诺依曼体系结构与操作系统及其进程
180 1
|
5月前
|
小程序 Linux
【编程小实验】利用Linux fork()与文件I/O:父进程与子进程协同实现高效cp命令(前半文件与后半文件并行复制)
这个小程序是在文件IO的基础上去结合父子进程的一个使用,利用父子进程相互独立的特点实现对数据不同的操作
130 2