linux基础知识——IPC之管道
1.IPC
\qquadlinux環(huán)境下,進(jìn)程的地址空間相互獨(dú)立,每個進(jìn)程都有各自不同的用戶地址空間。任何一個進(jìn)程的全局變量在另外一個進(jìn)程中都看不到,所以進(jìn)程之間不能直接互相訪問,進(jìn)程間要想交換數(shù)據(jù)只能通過內(nèi)核,在內(nèi)核中開辟一塊緩沖區(qū),進(jìn)程1把數(shù)據(jù)從用戶空間拷貝到內(nèi)核緩沖區(qū),進(jìn)程2再從內(nèi)核緩沖區(qū)把數(shù)據(jù)讀走,內(nèi)核提供的這種機(jī)制被稱為進(jìn)程間通信(IPC,interprocess communication)。
\qquad在進(jìn)程間完成數(shù)據(jù)互換,需要借助操作系統(tǒng)提供的特殊方式,現(xiàn)在常用的有:管道(最簡單)、信號(開銷最小)、共享映射區(qū)(無血緣關(guān)系)、本地套接字(最穩(wěn)定)
2.管道
\qquad管道是一種最基本的IPC機(jī)制,作用于有血緣關(guān)系的進(jìn)程之間,進(jìn)行數(shù)據(jù)交換。其具有如下的特點(diǎn):
\qquad管道本質(zhì)是一種偽文件(實(shí)際是內(nèi)核緩沖區(qū))
\qquad由兩個文件描述符引用,一個表示讀端,一個表示寫端
\qquad規(guī)定從管道的寫端流入數(shù)據(jù),從管道的讀端流出數(shù)據(jù)
\qquad管道的原理:管道通過內(nèi)核使用環(huán)形隊(duì)列機(jī)制,借助內(nèi)核緩沖區(qū)(4k)實(shí)現(xiàn)。
3.查看管道默認(rèn)大小
ulimit -a結(jié)果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數(shù)據(jù)不能自寫自讀
\qquad數(shù)據(jù)一旦被讀走,便在管道中消失,不能反復(fù)讀取
\qquad由于管道采用半雙工通信方式,因此,數(shù)據(jù)只能在一個方向上流動。
\qquad只能在有公共祖先的進(jìn)程間使用管道
4.管道交換數(shù)據(jù)的例子
#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){ //子進(jìn)程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; }總結(jié)
以上是生活随笔為你收集整理的linux基础知识——IPC之管道的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux的驱动开发——基于linux的
- 下一篇: linux的基础知识——模型结构和数据包