动画型网站,做免费推广的平台,广东华迪工程建设监理公司网站,工业设计的网站要想进程间通信#xff0c;数据交换#xff0c;必须通过内核#xff1b;
一个进程将数据写到内核#xff0c;然后另一个进程从内核读走数据。
IPC#xff1a;进程间通信#xff08;interprocess communication)
通信方式#xff1a;
管道信号共享映射区#xff08;…要想进程间通信数据交换必须通过内核
一个进程将数据写到内核然后另一个进程从内核读走数据。
IPC进程间通信interprocess communication)
通信方式
管道信号共享映射区无血缘关系本地套接字 管道
概念
管道是一种最基本的IPC机制也称匿名管道应用于有血缘关系的进程之间完成数据传递。
特质
管道的本质是一块内核缓冲区由两个文件描述符引用一个表示读端一个表示写段规定数据从管道的写端流入管道从读端流出当两个进程都终结的时候管道也自动消失管道的读端和写端默认都是阻塞的写端写满写不进阻塞读端读不到数据阻塞
原理
管道的实质是内核缓冲区内部使用环形队列实现默认缓冲区大小是4K,可以使用ulimit -a命令获取大小实际操作时缓冲区会根据数据压力做适当调整
局限性
数据一旦被读走便不在管道中存在不可反复读取数据只能在一个方向上流动若要实现双向流动必须使用两个管道只能在有血缘关系的进程间使用管道 创建管道-pipe函数
作用创建一个管道函数原型 int pipe(int pipefd[2]);也可以写int pipe(int *pipefd)写成pipefd[2]是为了说明传两个fd。参数若调用成功f[0]放读端f[1]放写端返回值成功返回0 失败返回-1,并设置error值
步骤
父进程调用pipe函数创建管道得到两个文件描述符fd[0]和fd[1]父进程调用fork函数创建子进程那么子进程也有两个文件描述符指向同一个管道父进程关闭管道读端子进程关闭通道写端。父进程写子进程读 结果 父子进程完成管道命令
如ps -aux | grep bash
文件描述符表 标准输出是写到终端标准输入是从终端读
思路我们可以使用dup2fd[1],STDOUT_FILENO函数写到管道的写端 dup2fd[0],STDIN_FILENO函数从管道的读端读 结果 兄弟进程完成管道命令
#includestdio.h
#includestdlib.h
#includestring.h
#includesys/types.h
#includeunistd.h
#include sys/wait.h
int main()
{int i0;int fd[2];int retpipe(fd);if(ret0){perror(pipe error);return -1;}for(;i2;i){pid_t pidfork();if(pid0){perror(fork error);return -1;}else if(pid0){printf(father:pid[%d]\n,getpid());sleep(1);}else if(pid0){printf(child:pid[%d],fpid[%d]\n,getpid(),getppid());break;}}if(i2){close(fd[0]);close(fd[1]);int wstatus;while(1){pid_t wpidwaitpid(-1,wstatus,WNOHANG);if(wpid0){continue;}else if(wpid0){if( WIFEXITED(wstatus)){printf(child[%d],return[%d]\n,wpid,WEXITSTATUS(wstatus));}}else if(wpid-1){printf(no child is living\n);break;}}}else if(i0){close(fd[0]);dup2(fd[1],STDOUT_FILENO);// close(fd[1]);execlp(ps,ps,-aux,NULL);perror(execlp error);exit(1);}else if(i1){close(fd[1]);dup2(fd[0],STDIN_FILENO);// close(fd[0]);execlp(grep,grep,bash,NULL);perror(execlp error);exit(1);}
}
注意点要关闭父进程的管道读写端口不然会一直阻塞。
结果