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(0);    

}

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 != 2)
    {
        fprintf(stderr,"usage :useupper file\n");
        exit(1);
    }
    filename = argv[1];//重新打开标准输入,并再次检查有无错误发生,然后用execl调用upper程序。
    for (i = 0;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(2);
    }

    execl("./upper","upper",0);
 //execl会替换当前的进程。如果没有发生错误,剩下的语句不会执行。
    perror("could not exec ./upper");
    exit(3);
}

分析一下这个程序的流程:

运行时我们应该给他提供一个文件,让他把文件的内容全部转换为大写。这项工作由upper程序完成,但它不会处理文件名参数。注意,我们不需要upper程序的源代码。我们可以利用这种方法

运行任何可执行程序。

useupper程序用freopen函数先关闭标准输入,然后将文件流stdin与程序参数给定的文件名关联起来。接下来,它调用execl用upper程序替换掉正在运行的进程代码。有hi那我IE已打开的文件描述符会在execl调用

之后保留下来,所以upper程序的运行情况和他在shell提示符下运行情况完全一致。 

ps:

1.

stdout(Standardoutput)标准输出

stdin(Standardinput)标准输入

stderr(Standarderror)标准错误

2.int fprintf (FILE* stream, const char*format, [argument])

FILE*stream:文件指针

const char* format:输出格式

argument  :附加参数列表

作用:

fprintf( )会根据参数format 字符串来转换并格式化数据, 然后将结果输出到参数stream 指定的文件中, 直到出现字符串结束(‘\0‘)为止。

3.FILE *freopen(const char * restrict filename, const char * restrict mode, FILE * restrict stream);

freopen是被包含于C标准库头文件<stdio.h>中的一个函数,用于重定向输入输出流。该函数可以在不改变代码原貌的情况下改变输入输出环境,但使用时应当保证流是可靠的。

形参说明:

filename:需要重定向到的文件名或文件路径。

mode:代表文件访问权限的字符串。例如,"r"表示“只读访问”、"w"表示“只写访问”、"a"表示“追加写入”。

stream:需要被重定向的文件流。

返回值:如果成功,则返回该指向该输出流的文件指针,否则返回为NULL。

4.perror()

perror(s) 用来将上一个函数发生错误的原因输出到标准设备(stderr)。参数 s 所指的字符串会先打印出,后面再加上错误原因字符串。此错误原因依照全局变量errno(这里的说法不准确,errno是一个宏,该宏返回左值) 的值来决定要输出的字符串。

在库函数中有个errno变量,每个errno值对应着以字符串表示的错误类型。当你调用"某些"函数出错时,该函数已经重新设置了errno的值。perror函数只是将你输入的一些信息和现在的errno所对应的错误一起输出。

以上内容来自《Linux程序设计第四版》PS部分来自百度百科

时间: 2024-12-29 17:05:36

Linuc学习3-输入和输出重定向的相关文章

输入和输出--重定向标准输入和输出

重定向标准输入和输出 Java的标准输入和输出分别通过system.in和system.out来代表,默认情况下他们分别代表键盘和显示器. 在system类中提供了3个重定向标准输入和输出的方法: setErr(PrintStream err)           重新分配"标准"错误输出流. setIn(InputStream in)              重新分配"标准"输入流. setOut(PrintStream out)         重新分配&qu

输入,输出重定向和管道

bash shell提供了一些特殊的操作符来将某个命令的输出重定向到另一个位置. 输出重定向 大于号(>)会将命令的结果以新建或覆盖的方式重定向到一个文件中. 双大于号(>>)会将命令的结果以追加的方式重定向到一个文件中 输入重定向 小于号(<)会将文件的数据重定向到命令 [email protected]:~/linsa$ wc < dd.txt 5 5 24 双小于号(<<)称为内联输入重定向,它的含义是允许你在命令行而不是在文件中指定输入重定向的数据 [em

C++学习42 输入和输出的概念

我们经常用到的输入和输出,都是以终端为对象的,即从键盘输入数据,运行结果输出到显示器屏幕上.从操作系统的角度看,每一个与主机相连的输入输出设备都被看作一个文件.除了以终端为对象进行输入和输出外,还经常用磁盘(光盘)作为输入输出对象,磁盘文件既可以作为输入文件,也可以作为输出文件. 程序的输入指的是从输入文件将数据传送给程序,程序的输出指的是从程序将数据传送给输出文件. C++输入输出包含以下三个方面的内容: 对系统指定的标准设备的输入和输出.即从键盘输入数据,输出到显示器屏幕.这种输入输出称为标

python语言学习5——输入和输出

输出 用print()在括号中加上字符串,就可以向屏幕上输出指定的文字. 注意点: 字符串用的是单引号 碰到逗号输出时就会输出一个空格 输入 python提供了一个input(),可以让用户输入一个字符串,并存放到一个变量里

Linux学习_随笔:输出重定向 &gt; log,由于print打印的内容过多,linux终端上显示不出完全信息

在调试代码的时候,我们时常借助print语句来进行调试.但有时,由于打印的内容过多,linux终端上显示不出完全信息. 1.此时我们可以借助命令:./test > log 或者是 ./test >> log 这样就把所有正确的信息都打印到log中,不正确的信息会打印到终端上. 注解: (1)> 是定向输出到文件,如果文件不存在,就创建文件:如果文件存在,就将其清空:一般我们备份清理日志文件的时候,就是这种方法:先备份日志,再用`>`,将日志文件清空(文件大小变成0字节): (

linux shell数据重定向(输入重定向与输出重定向)详细分析(转载)

本文为转载 原文链接 http://www.cnblogs.com/chengmo/archive/2010/10/20/1855805.html 在了解重定向之前,我们先来看看linux 的文件描述符. linux文件描述符:可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以实现文件的读写操作. 用户可以自定义文件描述符范围是:3-num,这个最大数字,跟用户的:ulimit –n 定义数字有关系,不能超过最大值. linux启动后,会

shell介绍,命令历史记录,命令和文件名自动补齐;通配符和输入\输出重定向

shell介绍 Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口.它接收用户输入的命令并把它送入内核去执行.在计算机硬件之间还有一层东西--系统内核.如果把计算机硬件比作一个人的躯体,那系统内核就是人的大脑.至于shell,把它比作人的五官似乎更贴切些.言归正传,用户直接面对的不是计算机硬件而是shell,用户把指令告诉shell,然后shell再传给系统内核,接着内核再去支配计算机硬件去执行各种操作.Bash (GNU Bourne-Again Shell) 是许多Linux

小蚂蚁学习Linux(10)——Linux输出重定向和输入重定向

说起输出重定向,先了解一下什么是标准的输入输出设备: 设备                                    文件名                        文件描述符                            类型 键盘                                    /dev/stdin                        0                                    标准输入 显示器     

linux学习之shell脚本 ------- 输入与输出

[本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020] 前面介绍了Shell脚本的基础和运算符等,今天再来看一下关于Shell脚本的输入与输出. Shell输入与输出的一些命令: echo read cat 管道 tee exec Shell输入与输出的一些概念: 文件重定向 标准输入.输出和错误 合并标准输出和标准错误 使用文件描述符 下面,我们挨个看每个命令的用法: 输入输出命令的用法: 1. echo 该命令的作用是可以显