红联Linux门户
Linux帮助

linux学习笔记(7)

发布时间:2008-10-20 18:29:59来源:红联作者:tanglun
[font=宋体]十一、管道的初级学习[/font]
[font=Times New Roman] [/font][font=宋体]管道----特殊的文件,独立的,只存在于内存中[/font]
[font=Times New Roman] [/font][font=宋体]----同属于一个进程产生的进程(同源性)[/font]
[font=Times New Roman] [/font][font=宋体]----采用半双工通信方式,同一时间只能有一方在传输数据[/font]
[font=Times New Roman] [/font][font=宋体]低级管道[/font]
[font=Times New Roman] [/font][font=宋体]用[/font][font=Times New Roman]pipe[/font][font=宋体]函数建立低级管道,建立后会产生两个文件描述符,[/font][font=Times New Roman]pipe_fd[0][/font][font=宋体]和[/font][font=Times New Roman]pipe_fd[1][/font][font=宋体]。[/font][font=Times New Roman]pipe_fd[0][/font][font=宋体]用来从管道中读出数据,[/font][font=Times New Roman]pipe_fd[1][/font][font=宋体]用来将数据写入管道(用[/font][font=Times New Roman]read[/font][font=宋体]和[/font][font=Times New Roman]write[/font][font=宋体]函数实现读写)。[/font]
[font=Times New Roman] [/font][font=宋体]管道数据流向图[/font]
[table=98%][tr][td][font=宋体]管道[/font]

[/td][/tr][/table][/size][size=3][table=98%][tr][td][font=Times New Roman]fd[1][/font]

[/td][/tr][/table][table=98%][tr][td][font=Times New Roman]fd[0][/font]

[/td][/tr][/table][font=Times New Roman][/font][font=Times New Roman][/font][font=Times New Roman][/font][font=Times New Roman][/font][table=98%][tr][td][font=宋体]管道[/font]

[/td][/tr][/table][table=98%][tr][td][font=Times New Roman]fd[1][/font]

[/td][/tr][/table][table=98%][tr][td][font=Times New Roman]fd[0][/font]

[/td][/tr][/table][font=Times New Roman][/font][font=Times New Roman][/font][font=Times New Roman][/size][/font][font=Times New Roman][size=3][/font][font=Times New Roman][/font][font=Times New Roman][/font]
[font=宋体]管道操作中常用的函数[/font]
[font=Times New Roman]
pipe
[/font][font=宋体]创建无名管道[/font]
[font=Times New Roman]
popen
[/font][font=宋体]创建标准流管道[/font]
[font=Times New Roman]
mkfifo
[/font][font=宋体]判断检测或更改信号屏蔽字[/font]
[font=Times New Roman] [/font]
[font=Times New Roman]pipe[/font][font=宋体]函数说明[/font]
[table][tr][td=1,1,115][font=宋体]函数头文件[/font]
[/td][td=1,1,453][font=Times New Roman]#include[/font]
[/td][/tr][tr][td=1,1,115][font=宋体]函数原型[/font]
[/td][td=1,1,453][font=Times New Roman]int
pipe (int files[2])
[/font]
[/td][/tr][tr][td=1,1,115][font=宋体]函数返回值[/font]
[/td][td=1,1,453][font=宋体]执行成功返回[/font][font=Times New Roman]0[/font][font=宋体],不成功返回[/font][font=Times New Roman]-1[/font]
[/td][/tr][/table][font=宋体]程序设计:设计一个程序,要求创建一个管道,复制进程,父进程写数据,子进程读数据。[/font]
[font=Times New Roman] [/font]
[font=宋体]流程图[/font]
[font=Times New Roman]

[/font][font=Times New Roman] [/font][table=98%][tr][td][font=宋体]创建管道[/font]

[/td][/tr][/table][table=98%][tr][td][font=宋体]开始[/font]

[/td][/tr][/table][table=98%][tr][td][font=Times New Roman]fork()[/font][font=宋体]创建子进程[/font]

[/td][/tr][/table][table=98%][tr][td][font=Times New Roman]if[/font]

[/td][/tr][/table][table=98%][tr][td][font=宋体]关闭[/font][font=Times New Roman]fd[0][/font]

[/td][/tr][/table][table=98%][tr][td][font=宋体]向管道写入数据数据[/font]

[/td][/tr][/table][table=98%][tr][td][font=宋体]关闭[/font][font=Times New Roman]fd[1][/font]

[/td][/tr][/table][table=98%][tr][td][font=宋体]等待子进程结束[/font]

[/td][/tr][/table][table=98%][tr][td][font=宋体]结束[/font]

[/td][/tr][/table][table=98%][tr][td][font=宋体]关闭[/font][font=Times New Roman]fd[1][/font]

[/td][/tr][/table][table=98%][tr][td][font=宋体]从管道读数据[/font]

[/td][/tr][/table][table=98%][tr][td][font=宋体]关闭[/font][font=Times New Roman]fd[0][/font]

[/td][/tr][/table][table=98%][tr][td][font=Times New Roman]exit[/font][font=宋体]退出[/font]

[/td][/tr][/table][/size][size=3][/size][size=3][/size][size=3][/size][size=3][/size][size=3][/size][size=3][/size][size=3][/size][size=3]0父进程 " fitpath="t" trim="t">[/size][size=3][font=Times New Roman]
[/font]
[font=Times New Roman]
result=fork();
/*creat subprocess*/[/font]
[font=Times New Roman]
[/font]
[font=Times New Roman]
if(result<0){printf("ERROR");exit(0);} /*failture*/[/font]
[font=Times New Roman]
else if(result==0)[/font]
[font=Times New Roman]
{close(pipe_fd[1]);[/font]
[font=Times New Roman]
if(r_num=read(pipe_fd[0],buf_r,100)>0)[/font]
[font=Times New Roman]
printf("subprocess readed %d character from pipe,context is %s\n ",r_num,buf_r);[/font]
[font=Times New Roman]
close(pipe_fd[0]);[/font]
[font=Times New Roman]
exit(0);[/font]
[font=Times New Roman]
}[/font]
[font=Times New Roman] [/font]
[font=Times New Roman]
/*father process*/[/font]
[font=Times New Roman]
else [/font]
[font=Times New Roman]
{[/font]
[font=Times New Roman]
close(pipe_fd[0]);[/font]
[font=Times New Roman]
if(write(pipe_fd[1],"hello,world!",20)!=-1)[/font]
[font=Times New Roman]
printf("input string is 'hello,world'\n");[/font]
[font=Times New Roman]
[/font]
[font=Times New Roman]
close(pipe_fd[1]); [/font]
[font=Times New Roman]
waitpid(result,NULL,0);
[/font]
[font=Times New Roman]
exit(0);[/font]
[font=Times New Roman]
}[/font]
[font=Times New Roman]
}[/font]
文章评论

共有 4 条评论

  1. 092012039 于 2012-01-19 18:49:29发表:

    多谢楼主,好东西,支持。。。

  2. js001sdx 于 2009-08-07 16:16:37发表:

    学习

  3. tanglun 于 2008-10-20 18:36:59发表:

    补充:头文件有#include #include #include #include #include

  4. tanglun 于 2008-10-20 18:31:38发表:

    由于模板不能复制流程图,导致流程图不能正确的显示,可以不要看流程图