0

0

c++怎么进行进程间通信(IPC)_c++常见进程通信方式与示例

下次还敢

下次还敢

发布时间:2025-11-02 23:23:35

|

910人浏览过

|

来源于php中文网

原创

管道用于父子进程通信,如匿名管道传递"Hello from child!";2. 共享内存通过shm_open和mmap实现高效数据共享;3. 消息队列用mq_send发送"Test message"实现异步通信;4. 信号量sem_wait与sem_post保证临界区互斥;5. Unix域套接字通过AF_UNIX实现本地进程通信。

c++怎么进行进程间通信(ipc)_c++常见进程通信方式与示例

在C++中进行进程间通信(IPC)有多种方式,适用于不同场景,比如数据共享、同步控制或跨进程调用。下面介绍几种常见的IPC机制及其使用示例,帮助你根据需求选择合适的方法。

1. 管道(Pipe)

管道是最基本的IPC方式之一,分为匿名管道和命名管道。匿名管道通常用于父子进程之间通信,而命名管道可在不相关的进程间使用。

匿名管道示例(父子进程):

#include 
#include 
#include 
#include 

int main() { int pipefd[2]; pid_t pid; const std::string msg = "Hello from child!";

if (pipe(pipefd) == -1) {
    perror("pipe");
    return 1;
}

pid = fork();
if (pid == 0) { // 子进程
    close(pipefd[0]); // 关闭读端
    write(pipefd[1], msg.c_str(), msg.length());
    close(pipefd[1]);
} else { // 父进程
    close(pipefd[1]); // 关闭写端
    char buffer[128] = {0};
    read(pipefd[0], buffer, sizeof(buffer));
    std::cout zuojiankuohaophpcnzuojiankuohaophpcn "Received: " zuojiankuohaophpcnzuojiankuohaophpcn buffer zuojiankuohaophpcnzuojiankuohaophpcn std::endl;
    close(pipefd[0]);
    wait(NULL);
}
return 0;

}

Moonbeam
Moonbeam

经过专业培训的 AI 写作助手,可帮助您撰写各类长篇内容。

下载

立即学习C++免费学习笔记(深入)”;

编译运行需在Linux/Unix环境下,使用g++并链接标准库

2. 共享内存(Shared Memory)

共享内存是最快的IPC方式,多个进程可访问同一块内存区域。需配合信号量等机制实现同步。

使用POSIX共享内存示例:

#include 
#include 
#include 
#include 
#include 

int main() { const char name = "/my_shm"; const int SIZE = 4096; int shm_fd; char ptr;

shm_fd = shm_open(name, O_CREAT | O_RDWR, 0666);
ftruncate(shm_fd, SIZE);

ptr = (char*)mmap(0, SIZE, PROT_WRITE, MAP_SHARED, shm_fd, 0);

std::strcpy(ptr, "Message via shared memory");

// 读取方稍后读取
sleep(2); // 模拟等待另一进程读取

shm_unlink(name);
return 0;

}

立即学习C++免费学习笔记(深入)”;

另一个进程可用相同名称打开并读取该内存段。

3. 消息队列(Message Queue)

消息队列允许进程通过结构化消息传递数据,支持异步通信。

POSIX消息队列示例:

#include 
#include 
#include 
#include 
#include 

int main() { mqd_t mq; struct mq_attr attr; const char* msg = "Test message";

attr.mq_flags = 0;
attr.mq_maxmsg = 10;
attr.mq_msgsize = 256;
attr.mq_curmsgs = 0;

mq = mq_open("/test_queue", O_CREAT | O_WRONLY, 0666, &attr);
mq_send(mq, msg, strlen(msg), 1);
mq_close(mq);
return 0;

}

立即学习C++免费学习笔记(深入)”;

接收进程使用O_RDONLY打开并调用mq_receive读取消息。

4. 信号量(Semaphore)

信号量用于进程间的同步,防止多个进程同时访问共享资源。

POSIX命名信号量示例:

#include 
#include 
#include 
#include 

int main() { sem_t* sem = sem_open("/my_sem", O_CREAT, 0666, 1);

sem_wait(sem); // 获取锁
std::cout zuojiankuohaophpcnzuojiankuohaophpcn "Process in critical section" zuojiankuohaophpcnzuojiankuohaophpcn std::endl;
sleep(2);
sem_post(sem); // 释放锁

sem_close(sem);
sem_unlink("/my_sem");
return 0;

}

立即学习C++免费学习笔记(深入)”;

多个进程可通过同一名称访问该信号量实现互斥。

5. 套接字(Socket)

套接字不仅可用于网络通信,也可用于本地进程通信(Unix域套接字),灵活性高。

Unix域数据报套接字示例(服务端):

#include 
#include 
#include 
#include 

int main() { int sockfd = socket(AF_UNIX, SOCK_DGRAM, 0); struct sockaddr_un addr; std::memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_UNIX; std::strcpy(addr.sun_path, "/tmp/socket");

bind(sockfd, (struct sockaddr*)&addr, sizeof(addr));

char buffer[256];
recvfrom(sockfd, buffer, sizeof(buffer), 0, nullptr, nullptr);
std::cout zuojiankuohaophpcnzuojiankuohaophpcn "Received: " zuojiankuohaophpcnzuojiankuohaophpcn buffer zuojiankuohaophpcnzuojiankuohaophpcn std::endl;

close(sockfd);
unlink("/tmp/socket");
return 0;

}

立即学习C++免费学习笔记(深入)”;

客户端创建同样类型的套接字并发送消息到该路径。

基本上就这些常见方式。选择哪种取决于你的平台、性能要求和通信模式。管道简单但限制多,共享内存高效但需注意同步,套接字最灵活适合复杂系统。实际开发中常组合使用,比如共享内存+信号量来兼顾速度与安全。

相关专题

更多
磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1353

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

704

2023.06.29

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

294

2023.06.30

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

777

2023.07.05

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

573

2023.07.06

linux查看文件夹大小
linux查看文件夹大小

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。linux怎么查看文件夹大小呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

547

2023.07.20

linux查看ip命令
linux查看ip命令

本专题为大家提供linux查看ip命令相关文章内容,感兴趣的朋友可以免费下载体验试试。

300

2023.07.20

linux查看cpu使用率
linux查看cpu使用率

在linux的系统维护中,可能需要经常查看cpu使用率,分析系统整体的运行情况。本专题为大家带来了linux查看cpu使用率的相关文章,感兴趣的朋友千万不要错过了。

381

2023.07.25

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

24

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.7万人学习

Git 教程
Git 教程

共21课时 | 2.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号