08_linux管道專题讲座-王保明.docx

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
08_linux管道專题讲座-王保明

linux管道-应用编程-专题讲座 written by 王保明linux管道基本概念1管道基本概念及操作管道基本概念管道是Unix中最古老的进程间通信的形式。我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”比如:eg: ls | wc -l ps –u wbm01|grep “aa”管道的本质====》固定大小的内核缓冲区管道限制管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道只能用于具有共同祖先的进程(具有亲缘关系的进程)之间进行通信;通常,一个管道由一个进程创建,然后该进程调用fork,此后父、子进程之间就可应用该管道。匿名管道pipe包含头文件unistd.h功能:创建一无名管道原型int pipe(int fd[2]);参数fd:文件描述符数组,其中fd[0]表示读端, fd[1]表示写端返回值:成功返回0,失败返回错误代码管道创建后示意图管道基本编程示例2管道和文件描述符在一起管道命令的编程实现: ls | wc –w文件描述符的深入理解#include unistd.h#include sys/stat.h#include sys/wait.h#include sys/types.h#include fcntl.h#include stdlib.h#include stdio.h#include errno.h#include string.h#include signal.h#define ERR_EXIT(m) \do \{ \perror(m); \exit(EXIT_FAILURE); \} while(0)int main21(void ){int pipefd[2];pid_t pid;if (pipe(pipefd) == -1 ){printf(pipe() err..\n);return -1;}pid = fork();if (pid == -1){printf(fork err..\n);return -1;}if (pid == 0){close(pipefd[0]);//复制文件描述符pipefd[1],给标准输出,言外之意:execlp的ls命令输出到管道中dup2(pipefd[1], STDOUT_FILENO);close(pipefd[1]);execlp(ls, ls, NULL);//如果替换新的进程印象失败,则会执行下面一句话sprintf(stderr, execute the cmd ls err..\n);exit(0);} else if (pid 0 ){int len = 0; char buf[100] = {0};close(pipefd[1]);//复制文件描述符pipefd[0],给标准输入,言外之意:execlp的wc命令从管道中读dup2(pipefd[0], STDIN_FILENO);close(pipefd[0]);//len = read(pipefd[0], buf, 100);execlp(wc, wc, -w, NULL);printf(len:%d, buf:%s \n, len , buf);//close(pipefd[0]);}wait(NULL);printf(parent ..quit\n);return 0;}int main(int argc, char *argv[]){close(0); //关闭表示输入open(makefile, O_RDONLY); //makefile文件变成标准输入close(1);//关闭标准输出open(makefile2, O_WRONLY | O_CREAT | O_TRUNC, 0644); //maifle2变成标准输出execlp(cat, cat, NULL); //替换进程印象后,执行cat命令//cat命名从标准输入中按行读,紧接着写到标准输出return 0;}2管道的读写规则管道读写规则研究(重点)当没有数据可读时O_NONBLOCK disable:read调用阻塞,即进程暂停执行,一直等到有数据来到为止。O_NONBLOCK enable:read调用返回-1,errno值为EAGAIN。当管道满的时候O_NONBLOCK disable: write调用阻塞,直到有进程读走数据O_NONBLOCK enable:调用返回-1,errno值为EAGAIN当管道不停的被写,写满的时候O_NONBLOCK disable: write调用阻塞O_NONBLOCK enable:调用返回-1,errno值为EAGAIN如果所有管道写端对应的文件描述符被关闭,则read返回0如果所有管道读端对应的文件描述符被关闭,则write操

文档评论(0)

stzs + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档