Linuc学习3-输入和输出重定向
Posted 逍的遥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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:
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-输入和输出重定向的主要内容,如果未能解决你的问题,请参考以下文章