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