Chinaunix首页 | 论坛 | 博客
  • 博客访问: 299009
  • 博文数量: 148
  • 博客积分: 4365
  • 博客等级: 上校
  • 技术积分: 1566
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-05 21:38
文章分类
文章存档

2014年(2)

2013年(45)

2012年(18)

2011年(1)

2009年(54)

2008年(28)

我的朋友

分类: LINUX

2009-03-14 19:30:09

本文介绍进程间通信最简单的形式-- 管道,管道中最简单的就是 popen与pclose 函数。
FILE *popen(const char *command, const char *type);
第一个参数为终端中命令语句,第二个为“r”或“w”,取决于是可读还是可写管道。
int pclose(FILE *stream);
注意popen返回的是文件指针而不是文件描述符,书中第一个例子如下:

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main()
{
    FILE *read_fp;
    char buffer[BUFSIZ + 1];
    int chars_read;
    memset(buffer, '\0', sizeof(buffer));
    read_fp = popen("uname -a", "r");
    if (read_fp != NULL) {
        chars_read = fread(buffer, sizeof(char), BUFSIZ, read_fp);
        if (chars_read > 0) {
            printf("Output was:-\n%s\n", buffer);
        }
        pclose(read_fp);
        exit(EXIT_SUCCESS);
    }
    exit(EXIT_FAILURE);
}

本程序读取查看内核版本的uname -r命令的输出,popen有些类似system函数,是先启动一个shell,然后将命令参数传递给这个shell,开销有一些大。

下面看一下底层的pipe函数,它返回的是文件描述符。
int pipe(int pipefd[2]); 参数为大小为2的整形数组(两个文件描述符),pipe调用成功后,这两个文件描述符将被连接,写到pipefd[1]中的数据可以从pipefd[0]中读出,类似中标准输入文件描述符为0,输出为1。
pipe常用于父子进程之间传递消息,在pipe调用成功后,再调用fork,父子进程可以一方写,一方读。
注意:调用pipe成功后,当不再使用这两个管道时,一定要对它们close,如果之后还创建了子进程,则父子进程都需调用close。

当需要终端作为标准输入或输出时,我们可以先关闭标准输入或输出,然后再用dup或dup2函数复制文件描述符,使之成为0或1,复制文件描述符时总是找最小的可用的开始。

pipe唯一的局限就是只能在相关进程(如父子进程)之间进行消息传递,面对不相关进程则无能为力。

                         未完待续

阅读(904) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~