進程間完成數據傳遞需要借助操作系統提供的特殊的方法,比如:文件、管道、信號、共享內存、消息隊列、套接字、命名管道等。但現在常用的進程間通信方式有:
管道 – 使用最簡單
?????? pipe
?????? 管道一般讀寫行為
FIFO(有名管道):
?????? 用于非血緣關系進程間通信
信號 – 開銷最小
共享映射區 – 無血緣關系
?????? nmap
?????? 函數的參數使用注意事項
?????? 用于非血緣關系進程間的通信
本地套接字 – 最穩定
?
Linux下其中文件類型
-?????? 文件
d???? 目錄
l ??? 符號鏈接
偽文件:
s????? 套接字
b???? 塊設備
c???? 字符設備
p???? 管道
其中文件、目錄、符號鏈接是占用磁盤存儲的。
?
管道:
- 本質是一個偽文件
- ?由兩個文件描述符引進,一個表示讀端,一個表示寫端。
- 規定數據從管道的寫端流入管道,從讀端流出。
?
管道的原理:管道實為內核使用環形隊列機制,借助內核緩沖區(4K)實現。
管道的局限性:
- 數據自己讀不能自己寫
- 數據一旦被讀走,就不在管道中存在,不可反復讀取。
- 由于管道采用半雙工方式,因此,數據只能在一個方向上流動。
- 只能在由公共祖先的進程間使用管道。
?
pipe()函數實現管道通信:
/*** pipe.c ***/ #include<stdio.h> #include<unistd.h> #include<stdlib.h> #include<string.h>int main() {int fd[2];pid_t pid;int ret = pipe(fd);if(-1 == ret){perror("pipe error:");exit(1);}pid = fork();if(-1 == pid){perror("pipe error:");exit(1);}else if(0 == pid) //son process read {close(fd[1]);char buf[1024];ret = read(fd[0],buf,sizeof(buf));if(0 == ret){printf("ret = %d\n",ret);}write(STDOUT_FILENO,buf,ret);}else //father process write {sleep(1);close(fd[0]);write(fd[1],"hello pipe\n",strlen("hello pipe\n"));}return 0; }
?