C++多进程之间通讯

在 C++ 中,线程和进程是有区别的:

  • 进程:是操作系统分配资源的基本单位,包括代码、数据和系统资源。每个进程都有自己独立的地址空间,因此进程之间不能直接访问彼此的内存。

  • 线程:是操作系统能够进行运算调度的最小单位。线程是进程的一个实体,是进程中的实际运行单位,线程拥有自己的堆栈和局部变量。线程之间可以直接访问彼此的内存。

在 C++ 中,std::thread 用于创建和管理线程,而不是进程。如果你需要创建进程,你可以使用操作系统提供的 API,例如在 Unix 系统上使用 fork() 函数,或者在 Windows 系统上使用 CreateProcess() 函数。

1、创建一个子进程:fork()

fork() 函数是一个标准的系统调用,用于在 Unix 和类 Unix 系统中创建新的进程。

以下是一个简单的例子,展示了如何使用 fork() 函数:

#include <iostream>
#include <unistd.h>

int main() {
    pid_t pid;
    pid = fork();

    if (pid < 0) {
        // fork() 失败
        std::cerr << "fork() failed\n";
        return 1;
    } else if (pid == 0) {
        // 子进程
        std::cout << "This is the child process, pid: " << getpid() << "\n";
    } else {
        // 父进程
        std::cout << "This is the parent process, pid: " << getpid() << ", child pid: " << pid << "\n";
    }

    return 0;
}

输出为:

xo@shahis1:~/demo$ vim fork_test.cpp
xo@shahis1:~/demo$ g++ fork_test.cpp -o fork_test
xo@shahis1:~/demo$ ./fork_test 
This is the parent process, pid: 1821956, child pid: 1821957
This is the child process, pid: 1821957

在这个例子中,fork() 函数会创建一个新的进程,并返回两次:一次在父进程中返回子进程的 PID,一次在子进程中返回 0。你可以使用这个返回值来区分父进程和子进程,并执行不同的操作。

如果你在使用 fork() 函数时遇到了问题,你可能需要检查以下几点:

  1. 编译器和操作系统:确保你的代码在支持 fork() 函数的系统上编译和运行。fork() 函数是 Unix 和类 Unix 系统的标准库函数,不支持 Windows。

  2. 权限:确保你有足够的权限来创建新的进程。在某些系统上,你可能需要管理员权限才能使用 fork() 函数。

  3. 错误处理:确保你正确处理了 fork() 函数的错误情况。在上面的例子中,我们检查了 pid 的值是否小于 0,这表示 fork() 函数调用失败。

一个进程操作公共容器的例子: 

#include <iostream>
#include <unistd.h>
#include <vector>
#include <mutex>
#include <sys/wait.h>

// 模拟一个容器
struct Container {
    int value;
};

// 全局变量
std::vector<Container> containers;
std::mutex mtx;

// 进程A创建若干db container
void processA() {
    std::cout &
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值