免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2146 | 回复: 3
打印 上一主题 下一主题

[C] 用未命名管道如何实现类似“cmd1 | cmd2 | cmd3”的功能? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-30 17:10 |只看该作者 |倒序浏览
是《unix进程间通信》一书中的习题,如何用未命名管道(c语言)实现类似shell命令像"last | sort |more"
的功能。

我是这样写的,但是没有成功,只能支持两个命令,如 “last | more" 或 "last | sort".
请高手帮忙看看,谢谢。

main(int argc, char *argv[])
{
    int f_des[2];
    char path[256];
    int i;

    if(pipe(f_des) == -1) {
        perror("Pipe");
        exit(1);
    }

    if(argc < 2) {
        printf("Usage: %s cmd\n", *argv);
        exit(0);
    }

    for(i = 1; i < argc - 1; i++) {

        switch(fork()) {
        case -1:
            perror("Fork");
            exit(2);
        case 0:
            memset(path, 0, 256);
            sprintf(path, "%s", "/usr/bin/");
            snprintf(path + strlen(path), 256,  "%s", argv);
            printf("%s\n", path);
            dup2(f_des[1], fileno(stdout));
            if ( i > 1) {
                dup2(f_des[0], fileno(stdin));
                sleep(1);
            }

            close(f_des[0]);
            close(f_des[1]);
            execl(path, argv, (char *) 0);
        default:
            break;
        }
    }

    sleep(3);
    memset(path, 0, 256);
    sprintf(path, "%s", "/usr/bin/");
    snprintf(path + strlen(path), 256, "%s", argv[argc-1]);
    printf("%s\n",path);
    dup2(f_des[0], fileno(stdin));
    close(f_des[0]);
    close(f_des[1]);
    execl(path, argv[argc-1], (char *) 0);
}

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2008-10-30 17:16 |只看该作者
你举了一就不会反一下三麽。
一个 | 和两个 | 都是一样的,只不过多 dup2 几下罢了。

论坛徽章:
0
3 [报告]
发表于 2008-10-30 18:39 |只看该作者
原帖由 flw 于 2008-10-30 17:16 发表
你举了一就不会反一下三麽。
一个 | 和两个 | 都是一样的,只不过多 dup2 几下罢了。


既然答复了就多说两句吧!!!

论坛徽章:
0
4 [报告]
发表于 2008-10-31 17:20 |只看该作者
顶一下!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP