读书笔记:第4章 管道和FIFO (3)

        《UNIX网络编程:卷2》P40:图4-15 使用popen的客户-服务器程序

/* P40 mainpopen.c */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#define MAXLINE 1024
int main(int argc, char *argv[])
{
    size_t  n;  
    char    buff[MAXLINE], command[MAXLINE];
    FILE    *fp;
    fgets(buff, MAXLINE, stdin);        // 读取路径名
    n = strlen(buff);
    if (buff[n-1] == '\n')              // 去除换行符
        n--;
    // 构建一个命令
    snprintf(command, sizeof(command), "cat %s", buff);
    // 创建一个管道,并启动另外一个进程,调用进程读入command的标准输出
    if ((fp = popen(command, "r")) == NULL) {
        fprintf(stderr, "popen error: %s\n", strerror(errno));
        exit(1);
    }   
    // 将来自shell或cat程序的输出复制到标准输出
    while (fgets(buff, MAXLINE, fp) != NULL)
        fputs(buff, stdout);
    // 关闭由popen创建的标准I/O流
    pclose(fp);
    exit(0);
}

        路径名从标准输入读出,随后构建一个命令并把它传递给popen,来自shell或cat程序的输出被复制到标准输出。

        现在我们依赖于由系统cat程序产生的出错消息。运行结果如下:

$ ./mainpopen 
/etc/shadow
cat: /etc/shadow: 权限不够

        上面的例子中,popen调用是成功的,但是其后的fgets只是在首次被调用时返回一个文件结束符。cat程序将它的出错消息写到标准输出,但popen不对标准错误输出作任何特殊处理——只有标准输出才被重定向到由它创建的管道。

你可能感兴趣的:(读书笔记,《UNIX网络编程》)