尝试实现我自己的Linux外壳几个基本功能,当然是时候实现管道的问题。更具体的管道工程大部分,尽管似乎放弃了最后一个论点。例如,如果我要运行命令管道在自定义的linux外壳

ps ax | grep ps

将grep命令后的ps放在我的shell中。因此,而不是输出这是使用典型的Linux外壳

339 ? S 0:00 upstart-udev-bridge --daemon

497 ? Ss 0:00 /usr/sbin/cupsd -F

503 ? S< 0:00 [kpsmoused]

720 ? S 0:00 upstart-socket-bridge --daemon

5541 pts/0 R+ 0:00 ps ax

5542 pts/0 S+ 0:00 grep --colour=auto ps

显示你得到这个

339 ? S 0:00 upstart-udev-bridge --daemon

497 ? Ss 0:00 /usr/sbin/cupsd -F

503 ? S< 0:00 [kpsmoused]

720 ? S 0:00 upstart-socket-bridge --daemon

5557 pts/0 R+ 0:00 ps ax

在这种情况下你不寻找匹配模式PS。

如下

void mypipes(char* args[], int nargs)

{

pid_t pid;

int fd[2];

char* cmdargs[nargs - 2];

char* cmdargs2[nargs - 2];

int i;

int t = 0;

int count = 0;

for(i = 0; i < nargs; i++)

{

if(!strcmp(args[i], "|"))

{

//dont put into array

t = 1;

}

else if(t == 0)

{

cmdargs[i] = args[i];

count++;

}

else if(t == 1)

{

cmdargs2[i - 3] = args[i];

}

}

if(count == 2)

{

pipe(fd);

pid = fork();

if(pid == -1)

{

perror("unable to fork");

exit(1);

}

if(pid > 0)

{

wait(&pid);

close(fd[1]);

close(0);

dup2(fd[0],0);

execlp(cmdargs2[0], cmdargs2[0], cmdargs2[1], NULL);

}

if(pid == 0)

{

close(fd[0]);

close(1);

dup2(fd[1],1);

execlp(cmdargs[0], cmdargs[0], cmdargs[1], NULL);

}

}

if(count == 1)

{

pipe(fd);

pid = fork();

if(pid == -1)

{

perror("unable to fork");

exit(1);

}

if(pid > 0)

{

wait(&pid);

close(fd[1]);

close(0);

dup2(fd[0],0);

execlp(cmdargs2[0], cmdargs2[1], NULL);

}

if(pid == 0)

{

close(fd[0]);

close(1);

dup2(fd[1],1);

execlp(cmdargs[0], cmdargs[1], NULL);

}

}

}

我检查,看看是否管后,所有的变数仍然是第二组参数中,他们是问题的管道运行的作用不是主要的,但我正在执行实际管道的地方,它不会读到最后。

非常感谢您提供有关可能出现错误的提示。

linux 自定义外壳,管道在自定义的linux外壳相关推荐

  1. linux怎么打出管道命令这个符号,linux 管道命令 竖线 ‘ | ’

    管道符号,是unix功能强大的一个地方,符号是一条竖线:"|", 用法: command 1 | command 2 他的功能是把第一个命令command 1执行的结果作为comm ...

  2. Linux脚本保存管道中的变量,Linux下管道重定向使用以及Shell编程(操作系统)

    实验名称:Linux的基本操作 实验目的: 1.了解管道和重定向 2.熟悉基本的Linux脚本的编写 实验环境:Ubuntu 12.4(32位,简体中文) 实验内容: 1.将当前用户目录下的文件清单输 ...

  3. Linux系统启动流程(4)制作自定义linux之一

    Linux系统启动流程(4)制作自定义linux之一 平时使用的服务器类型的linux系统一般都会装载各种软件与服务,而在某些情况下,并不能一直直接使用公司管理的系统,一是可能会出现故障,二是在处理一 ...

  4. linux系统下对硬盘自定义分区格式化的分析与实现

    前言: 在这个数据爆炸的时代,数据存储也显得尤为的重要.存储形式从原来的U盘,SD卡硬盘发展到现在的网络存储,云存储.存储空间也是从原来的M大小到现在动辄T为单位的大容量存储.因为工作关系有接触数据存 ...

  5. Linux中的管道与重定向

    前言: 这篇博文主要参考了鸟哥的<鸟哥的Linux私房菜>和杨鹏(NetSnake)的<Linux服务器架设>这两本书,以及在网络上查阅的资料.此博文作为我阅读<鸟哥的L ...

  6. linux用pipe创建的文件类型,linux文件类型之 管道

    inux 管道管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间,这是它与有名管道的最大区别.有名管 ...

  7. Linux进程间通信之管道(pipe)、命名管道(FIFO)与信号(Signal)

    整理自网络 Unix IPC包括:管道(pipe).命名管道(FIFO)与信号(Signal) 管道(pipe) 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道 ...

  8. linux pipe 阻塞,Linux pipe():從管道中讀取數據並不總是能夠解阻塞寫入器

    I have a problem using pipe under Linux. I would like to fill a pipe to make further write's call bl ...

  9. opipe--一款基于java的自定义“命令”管道

    opipe是一个"命令"管道,其设计思路与linux的命令管道一致.不同的是,linux的命令管道串联了一组命令,命令间是以输入.输出流串联在一起的.而opipe实际为一个操作(函 ...

最新文章

  1. CMakeLists.txt文件如何编写?(一 基础篇)
  2. html禁止手机文字放大,js实现移动端微信页面禁止字体放大
  3. 尚学堂requireJs课程---2、模块
  4. 面试官:Maven 的这 7 个问题你思考过没有?
  5. mysql 排序后在查询
  6. CANoe 13 demo 下载和激活-转载
  7. 汉王手写板linux驱动下载,汉王科教手写板易教2.0驱动
  8. Goole helper使用
  9. Linux网络编程 - 在服务器端运用进程间通信之管道(pipe)
  10. 蓝牙耳机品牌排行榜,连接稳定的四款蓝牙耳机分享
  11. 概率论3——古典概型与二项分布
  12. 元器件封装标准IPC-7351及电子开发论坛集合
  13. Api --String知识点
  14. java比较两个对象_java判断两个对象是否相等的方法
  15. 整数二分详解---yxc
  16. JS/jQuery 遍历对象属性
  17. 洛谷P1101 单词方阵
  18. sv中静态属性和静态方法
  19. 阿里云大学推出云学院中小企业学习优惠方案,加速提升企业云时代人才竞争力
  20. 四元数 右手系-左手系 转换

热门文章

  1. 王二涛团队及合作者揭示沙棘放线菌固氮生物学机制
  2. 教你高效地学习和制作PPT
  3. 基础006 宏基因组入门理论以及分析环境的部署
  4. R语言KNN模型数据分类实战
  5. R语言基于DALEX包进行特征筛选(feature selection)
  6. RANSAC回归的鲁棒性
  7. 汪国华 基因组分析的生物信息学算法
  8. 查看服务器CPU的个数、CPU的核数、多核超线程数
  9. SQL2005的安装与 使用
  10. 最小二乘法和最大似然估计