北邮linux 管道 编程实践 等价指令

#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

#define STDIN 0
#define STDOUT 1

int main(int argc, char* argv[]) {
    // channel[0] read & channel[1] wirte
    int channel[2] = {0};
    
    int STDOUT_BACKUP = dup(STDOUT);
    int STDIN_BACKUP = dup(STDIN);

    // 创建管道
    pipe(channel);

    int ret = fork();
    if (ret) {
        // 父进程 关闭写端
        close(channel[1]);

        wait(NULL);

        // 将读端重定向到标准输入
        dup2(channel[0], STDIN);
        int destFile = open("./r.txt", O_CREAT|O_WRONLY, S_IRUSR);
        dup2(destFile, STDOUT);

        // 运行wc 从标准输入读入数据, 输出到标准输出->r.txt
        if (!fork()) {
            execlp("wc", "wc", "-l", NULL);
        } else {
            wait(NULL);
            dup2(STDOUT_BACKUP, STDOUT);
            dup2(STDIN_BACKUP, STDIN);
        
            // 关闭文件描述符
            close(destFile);
            close(channel[0]);

            // 执行cat命令
            execlp("ls", "ls", "-l", NULL);
            fflush(NULL);
        }
    } else {
        // 子进程 关闭读端
        close(channel[0]);

        int fromFile = open("/etc/passwd", O_RDONLY);
        dup2(fromFile, STDIN);
        dup2(channel[1], STDOUT);

        close(fromFile);
        // 发送EOF
        close(channel[1]);
        
        execlp("grep", "grep", "-v", "usr", NULL);
    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值