C实现shell管理的一个例子
通常情况下,一个进程(比如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管理的一个例子的更多相关文章
- 对Jena的简单理解和一个例子
本文简单介绍Jena(Jena 2.4),使用Protégé 3.1(不是最新版本)创建一个简单的生物(Creature)本体,然后参照Jena文档中的一个例子对本体进行简单的处理,输出本体中的Cla ...
- 编写shell管理脚本(一)
7.1 查看当前linux系统中能够使用的shell程序的列表[root@localhost ~]# cat /etc/shells/bin/sh/bin/bash/sbin/nologin/bin ...
- 理解 Linux shell 中的一个方言:2>&1
理解 Linux shell 中的一个方言:2>&1 2016-11-14 杜亦舒 前言 在使用 linux 命令或者 shell 编程时,这个用法常会遇到 2>&1 如 ...
- Webpack入门——使用Webpack打包Angular项目的一个例子
2016.1.22,对大多数人来说,这是一个非常平常的日子,但这却是我决定在博客园写博客的日子.虽然注册博客园的博客已有4年8个月,却一直没有动手写过一篇博客,原因是觉得自己水平不行,写不出好东西,所 ...
- [asp.net core]SignalR一个例子
摘要 在一个后台管理的页面想实时监控一些操作的数据,想到用signalR. 一个例子 asp.net core+signalR 使用Nuget安装包:Microsoft.AspNetCore.Sign ...
- Bootice1.34版本把grub4dos0.46a写入硬盘MBR失败一个例子
Bootice1.34版本把grub4dos0.46a写入硬盘MBR失败一个例子 一个同事的台式机,BIOS启动,500GB硬盘,分了四个MBR分区,C盘是激活的主分区,第二个分区50 ...
- C#调用Power Shell 管理Office365 执行脚本时遇到的问题
Power Shell管理Office参考http://www.mamicode.com/info-detail-494553.html C#调用Power Shell 参考 https://www. ...
- 从一个例子入手Istio
转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 本文使用的Istio源码是 release 1.5. 本篇是Istio系列的第一篇,希望 ...
- spring笔记--使用springAPI以及自定义类 实现AOP的一个例子
Spring的另一个重要思想是AOP,面向切面的编程,它提供了一种机制,可以在执行业务前后执行另外的代码,Servlet中的Filter就是一种AOP思想的体现,下面通过一个例子来感受一下. 假设我们 ...
随机推荐
- 前端学习笔记2017.6.12 CSS控制DIV
前一篇文章中用div布局了豆瓣东西的页面,如果用html代码表示的话大概是这个样子的 <!DOCTYPE html><html><head></head> ...
- 算法Sedgewick第四版-第1章基础-015一stack只保留last指针
/************************************************************************* * * A generic queue, impl ...
- Entity Framework Tutorial Basics(23):Add Single Entity
Add New Entity using DBContext in Disconnected Scenario: In this chapter you will learn how to add n ...
- HDU 3001 Travelling (状压DP + BFS)
题意:有一个人要去旅游,他想要逛遍所有的城市,但是同一个城市又不想逛超过2次.现在给出城市之间的来往路费,他可以选择任意一个点为起点. 问逛遍所有城市的最低路费是多少. 析:用三进制表示每个城市的访问 ...
- 解决Spring MVC 对AOP不起作用的问题
用的是 SSM3的框架 Spring MVC 3.1 + Spring 3.1 + Mybatis3.1 第一种情况: Spring MVC 和 Spring 整合的时候,SpringMVC的spri ...
- springcloud 定义切面实现对请求操作记录日志,方便后面分析接口详情
package com.idoipo.infras.gateway.open.config; import com.alibaba.fastjson.JSON; import com.alibaba. ...
- Sqlserver根据条件去除重复数据并且留下的是最大值数据
项目中需要根据条件获取一些数据,但是如果条件相同的情况下,要去掉条件一样的并且某个值是最小的数据,留下的是最大值数据. 简单记录一下sql: --去重保留最大值那条 --Year和MCode一样的前提 ...
- multiset的应用
multiset 和set差不多 ,但是可以存储多个一样的元素
- iframe相关操作
内容摘要 父级获取iframe中的元素 父级触发iframe中的函数 iframe触发父级元素绑定的事件 iframe触发父级函数方法 iframe触发父级元素的值 parent.html <! ...
- vue 路由里面的 hash 和 history
对于 Vue 这类渐进式前端开发框架,为了构建 SPA(单页面应用),需要引入前端路由系统,这也就是 Vue-Router 存在的意义.前端路由的核心,就在于 —— 改变视图的同时不会向后端发出请求. ...