linux基础知识——IPC之管道
1.IPC
\qquadlinux環境下,進程的地址空間相互獨立,每個進程都有各自不同的用戶地址空間。任何一個進程的全局變量在另外一個進程中都看不到,所以進程之間不能直接互相訪問,進程間要想交換數據只能通過內核,在內核中開辟一塊緩沖區,進程1把數據從用戶空間拷貝到內核緩沖區,進程2再從內核緩沖區把數據讀走,內核提供的這種機制被稱為進程間通信(IPC,interprocess communication)。
\qquad在進程間完成數據互換,需要借助操作系統提供的特殊方式,現在常用的有:管道(最簡單)、信號(開銷最小)、共享映射區(無血緣關系)、本地套接字(最穩定)
2.管道
\qquad管道是一種最基本的IPC機制,作用于有血緣關系的進程之間,進行數據交換。其具有如下的特點:
\qquad管道本質是一種偽文件(實際是內核緩沖區)
\qquad由兩個文件描述符引用,一個表示讀端,一個表示寫端
\qquad規定從管道的寫端流入數據,從管道的讀端流出數據
\qquad管道的原理:管道通過內核使用環形隊列機制,借助內核緩沖區(4k)實現。
3.查看管道默認大小
ulimit -a結果pipe size (512 bytes, -p) 8:
core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 14488 max locked memory (kbytes, -l) 65536 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 14488 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited\qquad 8*512b=4k
\quad管道的局限性:
\qquad數據不能自寫自讀
\qquad數據一旦被讀走,便在管道中消失,不能反復讀取
\qquad由于管道采用半雙工通信方式,因此,數據只能在一個方向上流動。
\qquad只能在有公共祖先的進程間使用管道
4.管道交換數據的例子
#include<stdio.h> #include<unistd.h> #include<stdlib.h> #include<string.h>int main() {int fd[2];int ret;pid_t pid;ret = pipe(fd);if(ret==-1){perror("pipe error");exit(1);}pid = fork();if(pid==-1){perror("fork error");exit(1);}else if(pid==0){ //子進程close(fd[1]);char buf[1024];ret = read(fd[0],buf,sizeof(buf));//讀到buf里面if(ret==0){printf("讀取完成\n");}write(STDERR_FILENO,buf,ret);}else{close(fd[0]);write(fd[1],"hello world\n",strlen("hello world\n"));}return 0; }總結
以上是生活随笔為你收集整理的linux基础知识——IPC之管道的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux的驱动开发——基于linux的
- 下一篇: 深度学习环境搭建之Anaconda安装k