日期:2014-05-16  浏览次数:20569 次

apue里的P501页的figure 15.6程序怎么运行了没什么输出啊?
C/C++ code

#include <apue.h>
#include <sys/wait.h>
#define DEF_PAGER "/bin/more"

int main(int argc,char * argv[])
{
    pid_t  pid;
    char * argv0;
    char * pager;    
    int n;
    FILE * fp;
    int fd[2];
    char buffer[1024];
    if(argc != 2)
    {
        printf("usage : ./15.6 pathname\n");
        exit(0);
    }
    if((fp = fopen(argv[1],"r"))==NULL)
    {
        printf("can't open");
    }
    if(pipe(fd)<0)
    {
        printf("pipe error\n");
    }
    if((pid = fork())<0)
    {
        printf("fork error");
    }
    else if(pid > 0)
    {
        close(fd[0]);
        while(fgets(buffer,sizeof(buffer),fp) != NULL)
        {
            n = strlen(buffer);
            if(write(fd[1],buffer,n)!=n)
            {
                printf("write error");
            }
        }        
        if(ferror(fp))
        {
            printf("fgets error");
        }
        close(fd[1]);
        sleep(1);
        if(waitpid(pid,NULL,0)<0)
        {
            printf("wait error");
        }
        exit(0);
    }
    else
    {
        close(fd[1]);
        if(fd[0] != STDIN_FILENO)
        {
            if(dup2(fd[0],STDIN_FILENO) != STDIN_FILENO)
            {
                printf("duplicate error");
            }
            close(fd[0]);            
        }
        else
        {
            if((pager = getenv("PAGER"))==NULL)
            {
                pager = DEF_PAGER;
            }
            if((argv0 = strrchr(pager,'/'))!=NULL)
            {
                argv0++;
            }
            else argv0 = pager;
            if(execl(pager,argv0,(char *)0)<0)
            {
                printf("execute error\n");
            }
        }

    }
    exit(0);
}




我的程序可执行文件为 15.6
运行 ./15.6 zhc.txt(不目录下的zhc.txt文件)应该有输出啊??这程序是不是用来在终端以pager分页的方式输出zhc.txt中的内容啊?
怎么运行完了终端没任何内容输出啊??哪里错了,知道的帮一下忙,感激不尽!!!

------解决方案--------------------
close(fd[1]);
if(fd[0] != STDIN_FILENO)
{
if(dup2(fd[0],STDIN_FILENO) != STDIN_FILENO)
{
printf("duplicate error");
}
close(fd[0]);
}
else
{
下面这个else多余吧,应该无条件执行其中的语句