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