【IT168 技术文档】
四、管道编程技术
在程序中利用管道进行通信时,根据通信主体大体可以分为两种情况:一种是具有共同祖先的进程间的通信,比较简单;另一种是任意进程间通信,相对较为复杂。下面我们先从较为简单的进程内通信开始介绍。
1. 具有共同祖先的进程间通信管道编程
为了了解管道编程技术,我们先举一个例子。在这个例中,我们将在进程中新建一个管道,然后向它写入一个消息,管道读取消息后将其发出。代码如下所示:
示例代码1:管道程序示例
1: #include <unistd.h>
2: #include <stdio.h>
3: #include <string.h>
4:
5: #define MAX_LINE 80
6: #define PIPE_STDIN 0
7: #define PIPE_STDOUT 1
8:
9: int main()
10: ...{
11: const char *string=...{"A sample message."};
12: int ret, myPipe[2];
13: char buffer[MAX_LINE+1];
14:
15: /**//* 建立管道 */
16: ret = pipe( myPipe );
17:
18: if (ret == 0) ...{
19:
20: /**//* 将消息写入管道 */
21: write( myPipe[PIPE_STDOUT], string, strlen(string) );
22:
23: /**//* 从管道读取消息 */
24: ret = read( myPipe[PIPE_STDIN], buffer, MAX_LINE );
25:
26: /**//* 利用Null结束字符串 */
27: buffer[ ret ] = 0;
28:
29: printf("%s\n", buffer);
30:
31: }
32:
33: return 0;
34: }
上面的示例代码中,我们利用pipe调用新建了一个管道,参见第16行代码。 我们还建立了一个由两个元素组成的数组,用来描述我们的管道。我们的管道被定义为两个单独的文件描述符,一个用来输入,一个用来输出。我们能从管道的一端输入,然后从另一端读出。如果调用成功,pipe函数返回值为0。返回后,数组myPipe中存放的是两个新的文件描述符,其中元素myPipe[1]包含的文件描述符用于管道的输入,元素myPipe[0] 包含的文件描述符用于管道的输出。
在第21行代码,我们利用write函数把消息写入管道。站在应用程序的角度,它是在向stdout输出。现在,该管道存有我们的消息,我们可以利用第24行的read函数来读它。对于应用程序来说,我们是利用stdin描述符从管道读取消息的。read函数把从管道读取的数据存放到buffer变量中。然后在buffer变量的末尾添加一个NULL,这样就能利用printf函数正确的输出它了。在本例中的管道可以利用下图解释:
.jpg)
图2:示例代码1中半双工管道的示意图
这个例子中,通信是在具有共同祖先的进程间发生的,即父进程和子进程通信。这样做局限性太大,但我们只是用它来给读者一个感性的认识。接下来,我们将介绍更为高级的进程间的管道通信。
| 第1页: 管道技术模型 | 第2页: 信号与消息、管道与命名管道 |
| 第3页: 进程间通信管道编程 | 第4页: 进程间通信管道编程 |
| 第5页: dup函数和dup2函数 | 第6页: mkfifo函数 |
| 第7页: 与管道相关的系统命令 |