1.管道(pipe和fifo)
pipe:
int main(int argc, char const *argv[])
{
int fd[2];
int ret = pipe(fd);
if (pid==-1)
{
cout<<error<<endl;
}else{
close(fd[1]);
char buf[1024];
ret = read(fd[0],buf,sizeof(buf));
write(STDOUT_FILENO,buf,ret);
}else if (pid > 0)
{
sleep(1);
close(fd[0]);
cout<<"parent pid is:"<<getpid()<<endl;
wait(NULL);
}
return 0;
}
fifo:适用于无血缘关系的进程
#define P_FIFO "./p_fifo"
读进程:
if(mkfifo(P_FIFO,0777)<0)
cout<<"make fifo file failed"<<endl;
fd=open(P_FIFO,O_RDONLY|O_NONBLOCK);
while(1){
memset(cache,0,sizeof(cache));
if(0==read(fd,cache,100)){
cout<<"no data"<<endl;
}else{
cout<<get data:<<cahce<<endl;
}
sleep(1);
}
写进程:
fd=open(P_FIFO,O_WRONLY|O_NONBLOCK);
if(-1==fd){
cout<<"open failed"<<endl;
return 0;
}else{
cout<<"open success"<<endl;
}
write(fd,argv[0],100);
2.信号(开销小):主要用于事件通知,比如重启,keepalive
Linux中一共有
3.消息队列:支持进程间传输结构化消息
#include <mqueue.h>
int main() {
// 创建队列
mqd_t mq = mq_open("/test_queue", O_CREAT | O_RDWR, 0644, NULL);
// 发送消息
char message[] = "Hello POSIX MQ";
mq_send(mq, message, strlen(message), 0);
// 接收消息
char buffer[256];
mq_receive(mq, buffer, sizeof(buffer), NULL);
printf("收到: %s\n", buffer);
mq_close(mq);
mq_unlink("/test_queue");
return 0;
}
4.共享内存mmap
零拷贝:数据不需要在内核和用户空间间拷贝
高性能:直接内存访问,速度最快
需要同步:必须配合信号量或互斥锁使用
大容量:可以共享GB级内存
应用场景
高性能数据传输:图像、视频、音频数据
实时系统:ADView这样的自动驾驶系统
数据库系统:进程间共享数据缓存
科学计算:大矩阵、大数组计算
https://blog.csdn.net/weixin_61857742/article/details/128252280
#include
#include
#include
#include
#include
#include
#define SHM_SIZE 1024 // 共享内存大小
#define SHM_NAME "/myshm" // 共享内存名称
int main() {
int fd;
char *shmaddr;
char s8ReadBuf[1024] = {0};
const char *msg = "Hello, world!";
// 创建共享内存区域
fd = shm_open(SHM_NAME, O_CREAT | O_RDWR, 0666);
if (fd == -1) {
perror("shm_open");
exit(1);
}
// 调整共享内存区域的大小
if (ftruncate(fd, SHM_SIZE) == -1) {
perror("ftruncate");
exit(1);
}
// 映射共享内存区域到进程地址空间中
shmaddr = mmap(NULL, SHM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (shmaddr == MAP_FAILED) {
perror("mmap");
exit(1);
}
#if 1
// 在共享内存中写入数据
strncpy(shmaddr, msg, SHM_SIZE);
#else
// 读数据
// memcpy(s8ReadBuf, shmaddr, 1024);
// printf("s8ReadBuf:%s\n", s8ReadBuf);
#endif
// 解除共享内存区域与进程地址空间的映射关系
if (munmap(shmaddr, SHM_SIZE) == -1) {
perror("munmap");
exit(1);
}
// 删除共享内存区域的文件名并释放资源
if (shm_unlink(SHM_NAME) == -1) {
perror("shm_unlink");
exit(1);
}
return 0;
}
同步机制
// 必须配合信号量使用
#include <semaphore.h>
sem_t *sem = sem_open("/shm_sem", O_CREAT, 0644, 1);
// 写入时加锁
sem_wait(sem);
strcpy(shared_data, "Protected data");
sem_post(sem);
// 读取时也要加锁(如果需要一致性)
sem_wait(sem);
printf("Data: %s\n", shared_data);
sem_post(sem);
用管道作为共享内存的控制机制
套接字(本地套接字和网络套接字)