通常情况下,一个进程(比如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

C实现shell管理的一个例子的更多相关文章

  1. 对Jena的简单理解和一个例子

    本文简单介绍Jena(Jena 2.4),使用Protégé 3.1(不是最新版本)创建一个简单的生物(Creature)本体,然后参照Jena文档中的一个例子对本体进行简单的处理,输出本体中的Cla ...

  2. 编写shell管理脚本(一)

    7.1  查看当前linux系统中能够使用的shell程序的列表[root@localhost ~]# cat /etc/shells/bin/sh/bin/bash/sbin/nologin/bin ...

  3. 理解 Linux shell 中的一个方言:2>&1

    理解 Linux shell 中的一个方言:2>&1  2016-11-14 杜亦舒 前言 在使用 linux 命令或者 shell 编程时,这个用法常会遇到 2>&1 如 ...

  4. Webpack入门——使用Webpack打包Angular项目的一个例子

    2016.1.22,对大多数人来说,这是一个非常平常的日子,但这却是我决定在博客园写博客的日子.虽然注册博客园的博客已有4年8个月,却一直没有动手写过一篇博客,原因是觉得自己水平不行,写不出好东西,所 ...

  5. [asp.net core]SignalR一个例子

    摘要 在一个后台管理的页面想实时监控一些操作的数据,想到用signalR. 一个例子 asp.net core+signalR 使用Nuget安装包:Microsoft.AspNetCore.Sign ...

  6. Bootice1.34版本把grub4dos0.46a写入硬盘MBR失败一个例子

    Bootice1.34版本把grub4dos0.46a写入硬盘MBR失败一个例子         一个同事的台式机,BIOS启动,500GB硬盘,分了四个MBR分区,C盘是激活的主分区,第二个分区50 ...

  7. C#调用Power Shell 管理Office365 执行脚本时遇到的问题

    Power Shell管理Office参考http://www.mamicode.com/info-detail-494553.html C#调用Power Shell 参考 https://www. ...

  8. 从一个例子入手Istio

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 本文使用的Istio源码是 release 1.5. 本篇是Istio系列的第一篇,希望 ...

  9. spring笔记--使用springAPI以及自定义类 实现AOP的一个例子

    Spring的另一个重要思想是AOP,面向切面的编程,它提供了一种机制,可以在执行业务前后执行另外的代码,Servlet中的Filter就是一种AOP思想的体现,下面通过一个例子来感受一下. 假设我们 ...

随机推荐

  1. Angular03 将数据添加到组件中

    准备:已经搭建好angular-cli环境.知道如何创建组件 一.将一个数据添加到组件中 1 创建一个新的组件 user-item 2 将组件添加到静态模板中 3 为组件添加属性,并利用构造器赋值 4 ...

  2. ROS Learning-027 (提高篇-005 A Mobile Base-03) 控制移动平台 --- Twist 消息

    ROS 提高篇 之 A Mobile Base-03 - 控制移动平台 - Twist 消息 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubuntu 14 ...

  3. ZROI2018普转提day7t1

    传送门 分析 一道有意思的小题... 我们发现如果$(1,1)$为白色,则将其变为白色需要偶数次操作,而如果为黑色则需要奇数次操作 我们知道要让A赢需要奇数次操作,所以我们只需要判断$(1,1)$的颜 ...

  4. 通过shell脚本开始和结束守护进程

    //关闭脚本 #!/bin/sh WHOAMI=`whoami` PID=`ps -u $WHOAMI | grep 守护进程名 | awk '{print $1}'` if (用户名 "$ ...

  5. ubuntu安装软件-笔记

    手动安装过程 下载 - 配置文件 常用命令: sudo  dpkg -i ******.deb 问题&解决思路 问题1:依赖项 - 缺少某一个依赖包 解决尝试: 1 . sudo apt-ge ...

  6. [CentOS7] 安装sogou输入法

    CentOS7 下的默认输入法不是很好用,于是还是用sogou输入法 由于官网只有Ubuntu版本的sogou输入法安装包,于是先下载下来再说,博主用的版本在这里(密:ph13): 接下来解压data ...

  7. 使用jenkins来跑docker image的惨痛经历

    记录一下我使用jenkins来跑docker container的艰辛路程吧,是照着jenkins官网的[文档](https://jenkins.io/doc/tutorials/build-a-ja ...

  8. UINavigationController + UIScrollView组合,视图尺寸的设置探秘(二)

    承接上文,我想把view布局修改为如下模式,让ScrollView长在NavigationBar的下方,这总不会有遮挡的问题了吧: story board内容如下,主要是右侧视图蓝色区域添加了Scro ...

  9. Summer Holiday 强连通

    Problem Description To see a World in a Grain of Sand And a Heaven in a Wild Flower, Hold Infinity i ...

  10. Python和FTP

    1.HTTP主要用于基于Web的文件下载以及访问Web服务,一般客户端无须登录就可以访问服务器上的文件和服务.大部分HTTP文件传输请求都用于获取网页(即将网页文件下载到本地). 2.FTP主要用于匿 ...