jiankeabcd 2017-07-09 02:34 采纳率: 73.9%
浏览 2024
已采纳

使用C语言实现Linux管道符命令

例如
uniq < tmp.txt | wc -l
其中 tmp.txt为
0
0
1
1
1
2
0
2

可以使用fork, exec族群, pipe, dup, dup2, open, close的系统调用
不能直接使用execlp执行上述命令
我的想法是利用pipe实现单向管道,父进程使用exec执行uniq < txt,
执行后为
0
1
2
0
2
并将此标准输出用dup2替换为标准输入,进入子进程。子进程执行wc -l之后利用父进程的标准输入得到结果5
自己写的代码如下 但是无法正确输出 望高人解答

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

int main(int argc, char const *argv[]){
  int fd[2];
  pid_t pid;
  pipe(fd);
  if((pid = fork()) == 0){/* child process */
    close(fd[1]);
    execlp("wc", "wc", "-l", "fd[1]", NULL);
    close(fd[0]);
  }
  else{/* parent process */
    close(fd[0]);
        dup2(0, 1);
        close(0);
    fd[1] = open("tmp.txt", O_RDONLY);
    execlp("uniq", "uniq", "tmp.txt", NULL);
    close(fd[1]);
  }
}
  • 写回答

1条回答 默认 最新

  • devmiao 2017-07-09 12:45
    关注
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题