首页 > 系统相关 >linux多进程开发(二)使用pipe进行父子进程通讯

linux多进程开发(二)使用pipe进行父子进程通讯

时间:2023-01-05 16:00:37浏览次数:46  
标签:int pipe 管道 fd linux 进程 include

运行环境

  • win11 linux子系统Ubuntu2204
  • g++ 11.3.0

Linux DESKTOP-XXXXX 5.15.79.1-microsoft-standard-WSL2 #1 SMP Wed Nov 23 01:01:46 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

管道的概念

管道是一种最基本的IPC机制,作用于有血缘关系的进程之间,完成数据传递。调用pipe系统函数即可创建一个管道。有如下特质:

  1. 其本质是一个伪文件(实为内核缓冲区)

  2. 由两个文件描述符引用,一个表示读端,一个表示写端。

  3. 规定数据从管道的写端流入管道,从读端流出。

管道的原理: 管道实为内核使用环形队列机制,借助内核缓冲区(4k)实现。

管道的局限性:

① 数据自己读不能自己写。

② 数据一旦被读走,便不在管道中存在,不可反复读取。

③ 由于管道采用半双工通信方式。因此,数据只能在一个方向上流动。

④ 只能在有公共祖先的进程间使用管道。

常见的通信方式有,单工通信、半双工通信、全双工通信。

pipe函数

创建管道:

  • int pipe(int pipefd[2]); 成功:0;失败:-1,设置errno

函数调用成功返回r/w两个文件描述符。无需open,但需手动close。规定:fd[0] → r; fd[1] → w,就像0对应标准输入,1对应标准输出一样。向管道文件读写数据其实是在读写内核缓冲区。

父子进程使用pipe通讯

简单示例:

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

int main(int argc, char const* argv[])
{
    int fd[2];
    if (pipe(fd) == -1) 
	{
        perror("管道创建失败");
    }
    
    pid_t pid = fork();
    if (pid > 0)
	 { 
		// 父进程,读端:fd[0]
        char buf[256];
        bzero(buf, 256);
        read(fd[0], buf, 256);
        printf("child say %s\n", buf);
        wait(NULL);
    }
    else if (pid == 0) 
	{
		// 子进程,写端:fd[1]
        char s[256] = { "hello father." };
        write(fd[1], s, strlen(s));
        exit(0);
    }
    else {
        printf("进程创建失败\n");
    }
    close(fd[0]);
    close(fd[1]);
    return 0;
}
 

标签:int,pipe,管道,fd,linux,进程,include
From: https://www.cnblogs.com/livio/p/17027820.html

相关文章

  • linux 中echo 命令输出感叹号
     001、直接使用双引号输出[root@pc1test2]#echo"helloworld!"##双引号输出感叹号报错-bash:!":eventnotfound  002、测试转义字符[root@pc1......
  • 基于Linux下的Ubuntu操作系统常用命令
    一 .linux操作系统的特点1、linux下一切皆文件2、linux系统就像一个倒置数3、linux系统支持多用户、多任务二.Ubuntu--“乌班图”操作系统Ubuntu是一个以桌面应......
  • linux 中输出变量字符串的长度
     001、[root@pc1test]#a="abc"[root@pc1test]#b="abcde"[root@pc1test]#echo$aabc[root@pc1test]#echo$babcde[root@pc1test]#echo${#a}##......
  • Linux权限
    Linux下关于用户分为root系统普通三种用户 区分为id号0为root1-999是系统1000-60000是普通 用户权限u分区权限g其他o文件都有权限 权限一般分为3种分别......
  • Linux - 配置远程开发Linux C/C++程序环境
    1.使用VS2019远程开发LinuxC/C++程序所谓工欲善其事必先利其器,开发一个项目之前,我们要选择好合适的开发工具以及开发环境。1.1LinuxC/C++程序常见的开发方式在Lin......
  • linux crontab 定时任务详解
    前言正如闹钟对于日常生活的重要性一样,linuxcrontab定时任务在开发中是必不可少的工具,诸如:每六个月清理一次日志,每天凌晨12.00重启服务等多种场景,都可以用crontab......
  • 2_Linux中的网络配置
    服务器Linuxcentosip地址虚拟机中的网络配置1、桥接模式使用当前计算机中本地连接中的物理网卡虚拟机中自动获取的ip网段都在主机192.168......
  • 每日八题--Linux
    *********0104linux*********9.linux中常用目录解析/etc:存放配置文件mysql的配置文件默认在哪里?/usr/local/mysql/bin/mysqld/home:普通用户的家目录,在Linux中,每个用......
  • linux 命令使用5--vmstat(内存)
    1.简介如果你想动态的了解一下系统资源的使用状况,以及查看当前系统中到底是哪个环节最占用系统资源,就可以使用 vmstat命令。vmstat命令,是VirtualMeomoryStatistics(......
  • Linux 使用crontab设置定时任务
    1.查看crond服务是否启动#systemctlstatuscrond 如未安装服务,采用如下命令安装:#yum-yinstallvixie-cron//vixie-cron软件包是cron的主程序;#......