关注分享主机优惠活动
国内外VPS云服务器

什么是linux管道,如何使用(linux管道的作用是什么)

这篇文章主机频道详细介绍了“什么是linux管道,如何使用”。内容详细,步骤清晰,细节处理得当。希望这篇文章《什么是linux管道,如何使用》能帮你解决疑惑。让我们按照主机频道的思路,一起学习新知识。

管道是Linux进程之间的一种通信方式。两个进程可以通过一个共享内存区传递信息,流水线中的数据只能单向流动,也就是说只能有固定的写进程和读进程。目前在任何一个shell中,都可以使用|来连接两个命令,shell会用管道将两个进程的输入输出连接起来,达到进程间通信的目的。

什么是管道?烟斗,英语。管道是Linux进程之间的一种通信方式。两个进程可以通过一个共享内存区传递信息,流水线中的数据只能单向流动,也就是说只能有固定的写进程和读进程。

管道的发明者是道格拉斯·麦克洛伊,他也是UNIX上早期shell的发明者。在他发明了shell之后,他发现系统在运行和执行命令的时候,往往需要把一个程序的输出交给另一个程序来处理。这种操作可以通过使用输入输出重定向和添加文件来完成,例如:

linux管道是什么及怎么使用进程向自身发送消息。当然,这不叫进程间通信,所以我们不会在单个进程中使用管道。管道创建管道后,流程往往需要fork生成子流程,如下图所示:

linux管道是什么及怎么使用如图所示,fork生成的子进程会继承父进程对应的文件描述符。使用这个特性,在父进程首先创建管道之后,子进程也将获得同一管道的管道描述符。因此,父子进程可以通过使用一个管道来完成半双工通信。此时,父进程可以通过FD-6——此时,两个进程只使用流水线实现一个单工通信,在这种状态下,不需要考虑多个进程同时向流水线写操作导致的数据交叉问题。这是最经典的管道打开方式,也是我们推荐的管道使用方式。另外,作为一个程序员,即使知道Linux管道的实现,我们的代码也不能依赖它的特性,所以在处理管道的时候要判断,检查错误,这样代码才能更健壮。

底层的FIFO命名管道的实现和匿名管道完全一样,唯一的区别就是命名管道会有一个全局可见的文件名,供其他人打开使用。在程序中创建命名管道文件有两种方法,一种是使用mkfifo函数。另一种是使用mknod系统调用,例子如下:

[zorro @ zorro-PC pipe]$ cat mymkfifo . c
# include & ltstdio.h & gt
# include & ltsys/types . h & gt;
# include & ltsys/stat . h & gt;
# include & ltstdlib.h & gt

int main(int argc,char *argv[])
{

如果(argc!= 2) {
fprintf(标准错误,& quot参数错误!\ n & quot);
出口(1);
}

/*
if (mkfifo(argv[1],0600)& lt;0) {
perror(& quot;mkfifo()& quot;);
出口(1);
}
*/
if (mknod(argv[1],0600|S_IFIFO,0)& lt;0) {
perror(& quot;mknod()& quot;);
出口(1);
}

退出(0);
}我们使用第一个参数作为创建文件的路径。创建后,其他进程可以使用标准的文件操作,如open()、read()和write()。所有其他操作都类似于匿名管道的使用。需要注意的是,无论是命名管道还是匿名管道,其文件描述都没有offset的概念,因此无法通过lseek进行调整。

未经允许不得转载:主机频道 » 什么是linux管道,如何使用(linux管道的作用是什么)

评论 抢沙发

评论前必须登录!