打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
6.2.1 Basic Concepts

6.2.1 Basic Concepts

Simply put, a pipe is a method of connecting the standard output of oneprocess to the standard input of another. Pipes are the eldest of the IPCtools, having been around since the earliest incarnations of the UNIXoperating system. They provide a method of one-way communications (hencethe term half-duplex) between processes.

This feature is widely used, even on the UNIX command line (in the shell).

        ls | sort | lp

The above sets up a pipeline, taking the output of ls as the input of sort, and the output of sort as the input of lp. The data is running through ahalf duplex pipe, traveling (visually) left to right through the pipeline.

Although most of us use pipes quite religiously in shell script programming, we often do so without giving a second thought to what transpires at the kernellevel.

When a process creates a pipe, the kernel sets up two file descriptors for useby the pipe. One descriptor is used to allow a path of input into the pipe (write),while the other is used to obtain data from the pipe (read). At this point, thepipe is of little practical use, as the creating process can only use the pipe tocommunicate with itself. Consider this representation of a process and thekernel after a pipe has been created:

From the above diagram, it is easy to see how the descriptors are connectedtogether. If the process sends data through the pipe (fd0), it has the abilityto obtain (read) that information from fd1. However, there is a much largerobjective of the simplistic sketch above. While a pipe initially connects a process to itself, data traveling through the pipe moves through the kernel.Under Linux, in particular, pipes are actually represented internally with avalid inode. Of course, this inode resides within the kernel itself, and notwithin the bounds of any physical file system. This particular point willopen up some pretty handy I/O doors for us, as we will see a bit later on.

At this point, the pipe is fairly useless. After all, why go to the trouble ofcreating a pipe if we are only going to talk to ourself? At this point, the creating process typically forks a child process. Since a child process willinherit any open file descriptors from the parent, we now have the basis formultiprocess communication (between parent and child). Consider this updatedversion of our simple sketch:

Above, we see that both processes now have access to the file descriptors whichconstitute the pipeline. It is at this stage, that a critical decision must bemade. In which direction do we desire data to travel? Does the child processsend information to the parent, or vice-versa? The two processes mutually agreeon this issue, and proceed to ``close'' the end of the pipe that they are notconcerned with. For discussion purposes, let's say the child performs someprocessing, and sends information back through the pipe to the parent. Ournewly revised sketch would appear as such:

Construction of the pipeline is now complete! The only thing left to do ismake use of the pipe. To access a pipe directly, the same system calls thatare used for low-level file I/O can be used (recall that pipes are actuallyrepresented internally as a valid inode).

To send data to the pipe, we use the write() system call, and to retrieve datafrom the pipe, we use the read() system call. Remember, low-level file I/Osystem calls work with file descriptors! However, keep in mind that certainsystem calls, such as lseek(), do not work with descriptors to pipes.

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Basic Concepts_MSDN
basic index principal
SLA Lecture 4 Handout
翻译理论也可以不枯燥。
简易沙箱原理 ——Placing Restrictions on a Job's Processes
【Laravel系列7.9】测试
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服