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()函數
  穩定性最好

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM