Linuc学习3-输入和输出重定向
已打开的文件描述符在fork和exec调用后保留下来,我们可以利用对进程这方面知识点的理解来改变程序的行为。
这个例子涉及一个过滤程序:它从标准输入读取数据,然后向标准输出写数据,同时在输入和输出之间对数据做些有用的转换。
过滤程序upper.c
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
int main()
{
int ch;
while( EOF != (ch=getchar()))
{
putchar(toupper(ch));
}
exit(); }
upper.c执行效果:

如果我们利用shell从定向把一个文件的内容全部转为大写,如下所示:

如果我们想在另一个程序中使用这个过滤程序会发生什么呢?下一个例子useupper.c接受一个文件名做命令行参数,若果对它调用不正确,他将会响应一个错误信息。
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
int main(int argc,char *argv[])
{
char *filename;
int i;
if(argc != )
{
fprintf(stderr,"usage :useupper file\n");
exit();
}
filename = argv[];
//重新打开标准输入,并再次检查有无错误发生,然后用execl调用upper程序。
for (i = ;i<argc;i++)
{
printf("the argv[%d] is %s\n",i,argv[i]);
}
if(!freopen(filename,"r",stdin))
{
fprintf(stderr,"can't redirect stdin from file %s!\n",filename);
exit();
} execl("./upper","upper",);
//execl会替换当前的进程。如果没有发生错误,剩下的语句不会执行。
perror("could not exec ./upper");
exit();
}
分析一下这个程序的流程:
运行时我们应该给他提供一个文件,让他把文件的内容全部转换为大写。这项工作由upper程序完成,但它不会处理文件名参数。注意,我们不需要upper程序的源代码。我们可以利用这种方法
运行任何可执行程序。

useupper程序用freopen函数先关闭标准输入,然后将文件流stdin与程序参数给定的文件名关联起来。接下来,它调用execl用upper程序替换掉正在运行的进程代码。有hi那我IE已打开的文件描述符会在execl调用
之后保留下来,所以upper程序的运行情况和他在shell提示符下运行情况完全一致。 
ps:
2.int fprintf (FILE* stream, const char*format, [argument])
3.FILE *freopen(const char * restrict filename, const char * restrict mode, FILE * restrict stream);
freopen是被包含于C标准库头文件<stdio.h>中的一个函数,用于重定向输入输出流。该函数可以在不改变代码原貌的情况下改变输入输出环境,但使用时应当保证流是可靠的。
形参说明:
4.perror()

以上内容来自《Linux程序设计第四版》PS部分来自百度百科
Linuc学习3-输入和输出重定向的更多相关文章
- 从0开始的Python学习015输入与输出
简介 在之前的编程中,我们的信息打印,数据的展示都是在控制台(命令行)直接输出的,信息都是一次性的没有办法复用和保存以便下次查看,今天我们将学习Python的输入输出,解决以上问题. 复习 得到输入用 ...
- Shell 基础 -- 输入、输出重定向
一.文件描述符 文件描述符是一个非负的整数,Linux 中每个运行中的程序(进程),都有一些与之关联的文件描述符,你可以使用文件描述符来访问打开的文件或设备.在标准 I/O 库中,与文件描述符对应的是 ...
- C++学习42 输入和输出的概念
我们经常用到的输入和输出,都是以终端为对象的,即从键盘输入数据,运行结果输出到显示器屏幕上.从操作系统的角度看,每一个与主机相连的输入输出设备都被看作一个文件.除了以终端为对象进行输入和输出外,还经常 ...
- perl学习笔记——输入与输出
读取标准输入 用<STDIN>进行标准输入:chomp($line=<STDIN>); 如果读到文件尾,行输入操作符就会返回undef.便可利用这一性质跳出循环. while( ...
- Erlang学习记录:输入和输出
输入和输出 输入和输出功能都被定义在io模块 输出功能非常常用,由于erlang项目没有可断点调试的IDE(或者说根本不需要),所以所有的调试操作都是由io输出 来调试的 io:get_line/1. ...
- Python学习--02输入和输出
命令行输入 x = input("Please input x:") y = raw_input("Please input x:") 使用input和raw_ ...
- perl学习(5) 输入和输出
1.1. 从标准输入设备输入 <STDIN> 行输入操作在到达文件的结尾时将返回undef,在while循环的条件中不能使用chomp: while (defined($line = &l ...
- python语言学习5——输入和输出
输出 用print()在括号中加上字符串,就可以向屏幕上输出指定的文字. 注意点: 字符串用的是单引号 碰到逗号输出时就会输出一个空格 输入 python提供了一个input(),可以让用户输入一个字 ...
- Python学习笔记-输入与输出
一.Python提供了raw_input()和input()两个函数实现数据输入. 1.raw_input() 接收字符串类型的输入数据. str1=raw_input("请输入字符串:&q ...
随机推荐
- js 时间处理函数 获取今天的前几天和后几天的任意一天
var now = new Date(); let today = now.getFullYear() + '-' + (now.getMonth() + 1) + '-' + now.getDa ...
- java类和对象
类是对象的抽象 对象是类的一个实例类 对象 = new 类();拿对象可以操作这个类里的方法 java类与对象的区别是个老生常谈的问题,刚开始学java的时候就开始接触类和对象,今天来总结一下他们之间 ...
- javascript中对象访问自身属性的方式
在javascript中,通过对象的方法访问对象自身属性时,必须采用this.fieldName的方式. 原因是javascript中Function是无状态的,访问对象的属性时,必须指定当前的上下文 ...
- Hystrix 容错处理
目录 雪崩效应 容错的基本思想 什么是Hystrix 简单使用 消费端使用Hystrix 注解开启 改造消费方法 @HystrixCommand 详细配置 Hystrix线程隔离策略与传播上下文 Hy ...
- jenkins+maven+Tomcat8实现热部署
个人记录 公司使用jenkins实现代码自动更新并部署 采用jenkins安装方式为war包,版本为:2.138.3,启动方式为Tomcat启动jenkins, 该博客操作步骤有些地方进行简化,各位需 ...
- Moonraker:1靶机入侵
0x01 前言 攻击Moonraker系统并且找出存在最大的威胁漏洞,通过最大威胁漏洞攻击目标靶机系统并进行提权获取系统中root目录下的flag信息. Moonraker: 1镜像下载地址: h ...
- 解题:NOI 2014 购票
题面 观察一下部分分,我们发现链上的部分分是这样一个DP: $dp[i]=min(dp[i],dp[j]+dis(i,j)*p[i]+q[i])(dis(i,j)<=lim[i]\&\& ...
- 解题:POI 2008 Station
题面 水水的换根裸题,不过以前还真没做过换根的题 换根的思想就是在DFS中利用树的信息更新出当前点为根时的信息,具体来说一般是考虑子树外和子树内两部分 每个点的答案$ans$就是$ans[fa]+n- ...
- luoguP2123 皇后游戏——微扰法的应用与排序传递性的证明
题目背景 还记得 NOIP 2012 提高组 Day1 的国王游戏吗?时光飞逝,光阴荏苒,两年 过去了.国王游戏早已过时,如今已被皇后游戏取代,请你来解决类似于国王游 戏的另一个问题. 题目描述 皇后 ...
- CentOS 6.6搭建LNMP环境
一.安装前 1.关闭linux的安全机制 vim /etc/selinux/config SELINUX=enforcing 改为 SELINUX=disabled 2.关闭iptables防火墙 ...