通常情况下,一个进程(比如cat /tmp/tt.txt)的输出与输入是标准输入(stdin或者0)、标准输出(stdout或者1)

shell 获取tt.txt文件中包含aa的行记录,涉及两个进程,一个读文件,一个过滤

# cat /tmp/tt.txt |grep aa
aa

该方式的实现用到管道符,管道让一个进程的输出成为了另外一个进程的输入,管道更改了进程的输入输出;

下面使用C模拟管道的功能,主要用到fork与pipe两个函数,

fork函数被调用一次后,会产生两个进程,子进程号为0,父进程号大于0,虽然父子进程分别位于if和else中,但父子进程都会被执行,即fork后面的代码被执行了两次;

pipe函数就相当于管道的作用,在代码中重定向父子进程的输出输入,让子进程的输出变成父进程的输入

#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <string.h>
#include <stdlib.h> int test(){
int n;
const int maxline = ;
int fd[];
pid_t pid;
char line[maxline]; if(pipe(fd) < ){
perror("pipe");
exit();
} if((pid = fork()) < ){
perror("fork");
exit();
} if(pid == ){
close(fd[]); /*关闭子进程管道读,即管理的输出*/
close(); /*关闭标子进程标准输出,非必须*/
dup2(fd[],); /*复制子进程管道输入,把子进程的输出从标准输出重定向到管道的写,即管理的输入*/
close(fd[]); /*关闭原来的管道写*/
sleep();
system("cat /tmp/tt.txt");
return ;
}else{
close(fd[]); /*关闭父进程的管道写*/
close(); /*关闭父进程的标准输入*/
dup2(fd[],); /*复制父进程管道输出,把父进程的输入从标准输入重定向到管道的读,即管理的输出*/
close(fd[]); /*关闭原父进程的管理输出*/
system("grep aa");
}
return ;
} int main(){
test();
return ;
}
[root@itoracle mysql]# gcc test.cc -o test
[root@itoracle mysql]# ./test
aa

最新文章

  1. 移动端click事件延迟300ms问题
  2. Android 6编译环境搭建 (Marshmallow)
  3. winddows 运行指令 (2)
  4. java5 ReadWriteLock用法--读写锁实现
  5. html 表单 dom 注意跟表单的name值一致
  6. Bootstrap页面布局8 - BS常用标签与样式
  7. UITabBar 设置字体的颜色(选中状态/正常状态)setTitleTextAttributes
  8. align=absMiddle属性设置
  9. paip.无线路由器的无线接入WAN方式WDS设置大法
  10. C语言学习_从VC++6.0开始
  11. 批处理备份和恢复mysql数据库
  12. js 特效 手风琴效果
  13. CSS3秘笈:第八章
  14. Linux安装yum以及更新yum版本
  15. python 数据类型 -- set
  16. 增加Linux虚拟机的硬盘空间
  17. java语言浅显理解
  18. wpa_cli 关联无线网络
  19. OpenStack共享组件
  20. [PHP] 解决人人商城收银台不能上传图片问题

热门文章

  1. vray学习笔记(4)混合材质是个什么东西
  2. Linux cpulimit命令
  3. java中什么是代码点,什么是代码单元?
  4. 同一个id出现多条数据的问题
  5. WebGoat系列实验Denial of Service &amp; Insecure Communication
  6. [转载]Redhat Enterprise 6.1 如何使用免费的CentOS的yum源
  7. SQLServer存储引擎——02.内存
  8. P与NP问题详解
  9. 「JOI 2017 Final」JOIOI 王国
  10. 毛玻璃CHBlurEffect