linuxC进程间通信的几种方式

复制代码
1.管道,pipe()函数
  实现最简单,实际为内核缓冲区的环形队列。
  用于父子、兄弟等有血缘关系的进程间通信。   单向流动性,只能从管道读端读取,写端写入。
  int fds[2];
  pipe(fds);//传出参数,fd[0]为读端描述符,类似于stdin;fd[1]为写端描述符,类似于stdout
  
2.命名管道,fifo()函数
  Linux基础文件类型。
  可用于无血缘关系的进程间通信。
  可多个读端,多个写端。
  mkfifo("test", 0777);//创建一个命名管道
  int fd1 = open("test", O_WRONLY);write(fd1, buf, strlen(buf));//一个进程写入
  int fd2 = open("test", O_RDONLY)read(fd2, buf, sizeof(buf));//另一个进程读取
3.文件,open()函数
  fork创建的子进程,共享已打开的文件描述符。
  多个进程打开同一文件。
4.共享存储映射,mmap()函数
  借助文件创建映射内存。
  进程间无血缘关系要求   
void *mmap(void *addr, size_t len, int prot, int flags,int fd, off_t offset);
    addr:映射区首地址,传NULL,内核自动分配
    len:映射区大小
    prot:映射区读写权限,可选PROT_READ,PROT_WRITE,PROT_READ|PROT_WRITE
    flags:标志位,MAP_SHARED表示同步到文件,MAP_PRIVATE不同步到文件,MAP_ANONYMOUS/MAP_ANON匿名映射区
    fd:文件描述符
    offset:偏移量,从文件的开始偏移量多少开始映射。offset大小必须是4K整数倍
  int munmap(void *addr, size_t len);//释放映射区
    addr:映射区首地址,所以不能对映射区首地址进行++或者--操作
    len:映射区大小
  注意点:
    映射区创建完后文件可以立即关闭。
    用于创建映射区的文件大小不能为0。
    映射区创建过程含有对文件的读操作,所以文件起码得有读权限吧。
    偏移量offset必须是4K的整数倍,因为Linux页大小是4K
    munmap的地址必须是mmap返回的地址,不能映射区地址进行++或者--操作
    linux下创建匿名映射区使用MAP_SHARED、MAP_ANONYMOUS或者MAP_ANON参数和fd=-1即可,Unix下需要使用fd=open("/dev/zero",O_RDWR)。

5
.信号量,signal()函数、sigaction()函数
  开销最小
  具体介绍请看https://www.cnblogs.com/yongfengnice/p/11953839.html
6.本地套接字,socket()函数
  稳定性最好

复制代码

 

posted @   yongfengnice  阅读(1730)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
历史上的今天:
2017-11-18 window下的OpenGL学习环境搭建
2017-11-18 在Android Studio 的External Tools添加javap命令
点击右上角即可分享
微信分享提示