c++ linux通过实现独立进程之间的通信和传递字符串 demo

简介: 的进程间通信机制,适用于父子进程之间的数据传输。希望本文能帮助您更好地理解和应用Linux管道,提升开发效率。在实际开发中,除了管道,还可以根据具体需求选择消息队列、共享内存、套接字等其他进程间通信方

通过管道实现C++ Linux独立进程之间的通信和字符串传递

在Linux环境下,独立进程之间的通信(IPC)可以通过多种方式实现,包括管道、消息队列、共享内存和套接字。本文将详细介绍如何使用管道(pipe)在C++中实现独立进程之间的通信,并传递字符串。

一、管道简介

管道是Linux系统提供的一种进程间通信机制。管道本质上是内核缓冲区,可以在进程之间传递数据。管道分为无名管道和有名管道(FIFO)。本文将使用无名管道实现进程间的字符串传递。

二、实现步骤

2.1 创建管道

使用 pipe()系统调用创建一个无名管道。pipe()会创建一个包含两个文件描述符的数组:pipefd[0]用于读取,pipefd[1]用于写入。

2.2 创建子进程

使用 fork()系统调用创建一个子进程。在父进程中写入数据到管道中,在子进程中读取数据并打印出来。

2.3 代码示例

以下是一个完整的C++代码示例,演示如何通过管道在父子进程之间传递字符串:

#include <iostream>
#include <unistd.h>
#include <cstring>
#include <sys/wait.h>

int main() {
    int pipefd[2];
    pid_t pid;
    char buffer[128];
    const char* message = "Hello from parent process!";

    // 创建管道
    if (pipe(pipefd) == -1) {
        perror("pipe");
        return 1;
    }

    // 创建子进程
    pid = fork();
    if (pid == -1) {
        perror("fork");
        return 1;
    }

    if (pid == 0) {
        // 子进程:从管道中读取数据
        close(pipefd[1]); // 关闭写端
        read(pipefd[0], buffer, sizeof(buffer));
        std::cout << "Child process received: " << buffer << std::endl;
        close(pipefd[0]); // 关闭读端
    } else {
        // 父进程:向管道中写入数据
        close(pipefd[0]); // 关闭读端
        write(pipefd[1], message, strlen(message) + 1);
        close(pipefd[1]); // 关闭写端

        // 等待子进程结束
        wait(NULL);
    }

    return 0;
}
​

2.4 代码解释

  1. 创建管道:使用 pipe(pipefd)创建管道,pipefd是一个包含两个文件描述符的数组。

  2. 创建子进程:使用 fork()创建子进程。在父进程中,fork()返回子进程的PID;在子进程中,fork()返回0。

  3. 子进程读取数据

    • 关闭管道的写端(pipefd[1])。
    • 使用 read(pipefd[0], buffer, sizeof(buffer))从管道中读取数据。
    • 打印读取到的数据。
    • 关闭管道的读端(pipefd[0])。
  4. 父进程写入数据

    • 关闭管道的读端(pipefd[0])。
    • 使用 write(pipefd[1], message, strlen(message) + 1)向管道中写入数据。
    • 关闭管道的写端(pipefd[1])。
    • 使用 wait(NULL)等待子进程结束。

三、运行结果

编译并运行上述代码,应该会看到如下输出:

Child process received: Hello from parent process!
​

这表明父进程成功地通过管道将字符串传递给了子进程。

四、总结

通过本文的介绍,我们详细讲解了如何使用管道在C++中实现独立进程之间的通信,并成功地传递字符串。管道是一种简单而高效的进程间通信机制,适用于父子进程之间的数据传输。希望本文能帮助您更好地理解和应用Linux管道,提升开发效率。

在实际开发中,除了管道,还可以根据具体需求选择消息队列、共享内存、套接字等其他进程间通信方

目录
相关文章
|
14天前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
91 2
|
11月前
|
消息中间件 存储 供应链
进程间通信方式-----消息队列通信
【10月更文挑战第29天】消息队列通信是一种强大而灵活的进程间通信机制,它通过异步通信、解耦和缓冲等特性,为分布式系统和多进程应用提供了高效的通信方式。在实际应用中,需要根据具体的需求和场景,合理地选择和使用消息队列,以充分发挥其优势,同时注意其可能带来的复杂性和性能开销等问题。
|
11月前
|
存储 Unix Linux
进程间通信方式-----管道通信
【10月更文挑战第29天】管道通信是一种重要的进程间通信机制,它为进程间的数据传输和同步提供了一种简单有效的方法。通过合理地使用管道通信,可以实现不同进程之间的协作,提高系统的整体性能和效率。
|
12月前
|
Ubuntu Linux 编译器
Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV
通过以上步骤,您已经成功在Ubuntu系统下的VS Code中配置了C/C++项目环境,并能够调用OpenCV库进行开发。请确保每一步都按照您的系统实际情况进行适当调整。
2037 3
|
12月前
|
网络协议 Linux 网络性能优化
Linux C/C++之TCP / UDP通信
这篇文章详细介绍了Linux下C/C++语言实现TCP和UDP通信的方法,包括网络基础、通信模型、编程示例以及TCP和UDP的优缺点比较。
454 0
Linux C/C++之TCP / UDP通信
|
12月前
|
消息中间件 Linux API
Linux c/c++之IPC进程间通信
这篇文章详细介绍了Linux下C/C++进程间通信(IPC)的三种主要技术:共享内存、消息队列和信号量,包括它们的编程模型、API函数原型、优势与缺点,并通过示例代码展示了它们的创建、使用和管理方法。
260 0
Linux c/c++之IPC进程间通信
|
12月前
|
Linux C++
Linux c/c++进程间通信(1)
这篇文章介绍了Linux下C/C++进程间通信的几种方式,包括普通文件、文件映射虚拟内存、管道通信(FIFO),并提供了示例代码和标准输入输出设备的应用。
148 0
Linux c/c++进程间通信(1)
|
12月前
|
存储 Python
Python中的多进程通信实践指南
Python中的多进程通信实践指南
172 0
|
8月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
4月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
98 0