linux

linux内核编程-IPC进程间通信

2019-10-11  本文已影响0人  Peakmain

进程间通信方式

管道

管道的通信机制.png

1、无名管道,半双工的通信方式(只能一个方向流动)
2、管道可以理解为一种特殊的文件形式,我们可以用文件的读写方法,不是一个简单的文件,只会占用内存。
3、管道只能是血缘关系的进程间通信
4、数据不能自己写自己读
5、数据一旦读走不能再读


管道.png
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
int main(int argc,const char *argv[]){
    int fd[2];
    int ret=pipe(fd);
    if(ret!=0){
        printf("create pipe error!\n");
    }
    pid_t pid;
    pid= fork();
    char buff[20];
    if(pid<0){
        printf("fork error!\n");
    }else if(pid==0){
        //子进程
        close(fd[1]);
        sleep(1);
        read(fd[0],buff,11);
        //没有其他读写操作可以关闭fd[0]
        printf("pipe read:%s",buff);
    }else{
        close(fd[0]);//关闭读
        write(fd[1],"hello pipe\n",11); 
    }
    return 0;
}

信号

进程间通信的机制,内核自带的,信号不能携带大量的数据,一般就是一个数字,只有在特定情况下才会触发

 Process.killProcess(Process.myPid());

共享映射区

binder驱动,腾讯mmlv,xlog(日志库)

 void * mmap(void *addr, size_t len, int prot, int flags, int fd, off_t of    fset); 
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<unistd.h>
#include<fcntl.h>
 #include <sys/mman.h>
void sys_err(const char* msg){
 perror(msg);
 exit(0);
}
int main(){

/* void * mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset); */
       //create open file
       int fd;
      fd=open("test_map",O_RDWR|O_CREAT|O_TRUNC,0644);
      if(fd==-1){
       sys_err("open file error");
      }
      char* p;
      ftruncate(fd,20); 
      p=(char*)mmap(NULL,20,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
  if(p==MAP_FAILED){
       sys_err("mmp error");
}
     strcpy(p,"hello mmap\n");
     printf("----->%s",p);
     return 0;
}
mmap的实现原理.png

mmap注意事项
1、指定映射区的大小,必须小于文件大小
2、映射区大小必须大于0,否则会异常
3、创建映射区需要read权限,mmap的读写权限应该小于等于文件的权限
4、文件可以先关闭
5、偏移量必须是4k的整数倍
6、MAP_PRIVATE只会对内存进行修改,不会反应到磁盘上
mmap万能调用方法
open(O_PDRW):
mmap(NULL,有效大小,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
7、munmap释放

  int munmap(void *addr, size_t len);

binder驱动

binder驱动.png
上一篇 下一篇

猜你喜欢

热点阅读