首页 > 后端开发 > C++ > 正文

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

下次还敢
发布: 2025-11-02 23:23:35
原创
712人浏览过
管道用于父子进程通信,如匿名管道传递"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 <iostream>
#include <unistd.h>
#include <sys/wait.h>
#include <string>
<p>int main() {
int pipefd[2];
pid_t pid;
const std::string msg = "Hello from child!";</p><pre class='brush:php;toolbar:false;'>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 << "Received: " << buffer << std::endl;
    close(pipefd[0]);
    wait(NULL);
}
return 0;
登录后复制

}

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

通义万相
通义万相

通义万相,一个不断进化的AI艺术创作大模型

通义万相596
查看详情 通义万相

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

2. 共享内存(Shared Memory)

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

使用POSIX共享内存示例:

#include <iostream>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
#include <cstring>
<p>int main() {
const char<em> name = "/my_shm";
const int SIZE = 4096;
int shm_fd;
char</em> ptr;</p><pre class='brush:php;toolbar:false;'>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 <mqueue.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <iostream>
#include <cstring>
<p>int main() {
mqd_t mq;
struct mq_attr attr;
const char* msg = "Test message";</p><pre class='brush:php;toolbar:false;'>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 <semaphore.h>
#include <fcntl.h>
#include <iostream>
#include <unistd.h>
<p>int main() {
sem_t* sem = sem_open("/my_sem", O_CREAT, 0666, 1);</p><pre class='brush:php;toolbar:false;'>sem_wait(sem); // 获取锁
std::cout << "Process in critical section" << std::endl;
sleep(2);
sem_post(sem); // 释放锁

sem_close(sem);
sem_unlink("/my_sem");
return 0;
登录后复制

}

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

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

5. 套接字(Socket)

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

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

#include <sys/socket.h>
#include <sys/un.h>
#include <iostream>
#include <unistd.h>
<p>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");</p><pre class='brush:php;toolbar:false;'>bind(sockfd, (struct sockaddr*)&addr, sizeof(addr));

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

close(sockfd);
unlink("/tmp/socket");
return 0;
登录后复制

}

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

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

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

以上就是c++++怎么进行进程间通信(IPC)_c++常见进程通信方式与示例的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

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