Linux下C编程,进程通信之无名管道通信

简介: 最近在看进程间的通信,下面说说管道通信之无名管道。 1.概述   管道是Linux中很重要的一种通信方式,他是把一个程序的输出直接连接到另一个程序的输入,并且管道具有队列的特性。如Linux命令,“ps -ef | grep root”。

最近在看进程间的通信,下面说说管道通信之无名管道。

1.概述

  管道是Linux中很重要的一种通信方式,他是把一个程序的输出直接连接到另一个程序的输入,并且管道具有队列的特性。如Linux命令,“ps -ef | grep root”。如下图所示:

2.无名管道

  2.1特点

  (1)它只能用于具有亲缘关系的进程之间的通信(也就是父子进程或者兄弟进程之间)。
  (2)它是一个半双工的通信模式,具有固定的读端和写端。
  (3)管道也可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。

  2.2主要函数说明

  int pipe(int fd[2])

    传入参数fd[2]数组,管道的两个文件描述符,之后就可以直接操作这两个文件描述符。其中fd[0]是“读”描述符,fd[1]是“写”描述符。

  2.3使用代码及说明

#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    int pipe_fd[2];  /*用于保存两个文件描述符*/
    pid_t pid;
    char buf_r[100];  /*用于读数据的缓存*/
int r_num;  /*用于保存读入数据大数量*/ memset(buf_r,0,sizeof(buf_r)); if(pipe(pipe_fd)<0) /*创建管道,成功返回0,否则返回-1*/ return -1; /*fork()创建一子进程,
   具体使用可以参见:http://www.cnblogs.com/xudong-bupt/archive/2013/03/26/2982029.html
*/
if((pid=fork())==0) { close(pipe_fd[1]); /*关闭子进程写描述符,并通过使父进程暂停 2 秒确保父进程已关闭相应的读描述符*/ sleep(2); if((r_num=read(pipe_fd[0],buf_r,100))>0) /*子进程读取管道内容*/ printf("%d numbers read from the pipe is %s\n",r_num,buf_r); close(pipe_fd[0]);/*关闭子进程读描述符*/ exit(0); } else if(pid>0) { close(pipe_fd[0]);/*/关闭父进程读描述符,并分两次向管道中写入 Hello Pipe*/ if(write(pipe_fd[1],"Hello",5)!= -1) printf("parent write1 success!\n"); if(write(pipe_fd[1]," Pipe",5)!= -1) printf("parent write2 success!\n"); close(pipe_fd[1]);/*关闭父进程写描述符*/ sleep(3); exit(0); } }

 

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