第三篇 和系统对话(二)

C语言重定向实践

上一节中,我们介绍了如何将command命令的输出重定向到一个指定的文件里。然而有些时候,我们除了需要在指定文件里,记录下command的输出,还需要我们的应用程序(或者说病毒程序)。有人说,那我们可以是使用读写文件的方法啊,的确不错,但是还有一个更好的方法。而这种方法也是基于重定向的,有了这种方法之后,不管是system函数调用的输出还是printf函数的输出都会跑到指定文件里去。这是怎么实现的呢?且听我慢慢讲来~

        其实C语言是一门没有输入输出的语言(而且很多操作系统也是这样的),它们的输入输出设备其实都被虚拟为了文件的形式来进行管理。比如我们调用printf函数时,其实是将字符串写到FILE *stdout(句柄为1)指针指向的文件中;而scanf的读入其实只是从FILE *stdin(句柄为0)指向的文件中读取数据而已。也许这样说,你还半信半疑,那我们可以来看看这个例子:

        #include <stdio.h>

        int main()
        {
         char str[50];
         printf("Please input a string to display:/n");
         fgets(str,50,stdin);                                             //你可以在键盘上输入一个字符串。
          printf("Here is the outputs:/n");
        fputs(str,stdout);                                               //你输入的字符串将被显示出来。
        system("pause");
        return 0;
        }

        通过这个例子,我想你可以接受输入输出设备其实也是文件的思想了吧?那么如果我们可以让stdout或者stdin指针指向我们指定的文件,那不就实现输入输出重定向了吗?对!事实就是这么简单!不过我们还需要考虑一些细节的问题:

        第一,如何改变文件的指针,让它从一个文件指向另一个文件呢?也许有人会说,这个还不简单,先fclose(stdout); 然后stdout=fopen(output,"w"); 不就行了吗?哈哈,大家可以试试,这样应该是不行的,会出现一个错误信息:invalid lvalue in assignment。说明stdout指针是不能这样赋值的。我们需要使用一个新的函数:freopen函数。

        第二,也许有些时候我们需要将输入输出重定向,但是有时又需要回复本来的输入输出,该怎么办呢?(同一个程序中)也许这种情况,不止一种解决方法。我提供一种靠句柄来管理的方法,大家记住标准输入的句柄是0,标准输出的句柄是1。这里也需要两个函数:_dup()和_dup2()函数。

        下面让我们一边介绍一边来完成这样的重定向的功能吧!

         首先,我们需要将文件指针stdout指向我们指定的文件,比如:"out.txt"。我们需要使用这个函数。

        FILE *freopen( const char *path, const char *mode, FILE *stream );

        这个函数的功能是让指定的文件指针重新关联到另一个流文件上。mode即"wb"之类的。需要注意的是,当这个指针被重新关联之后,如果原来的流文件没有其他句柄管理它,那么它将会被关闭,即不可用。而这一般不是我们所希望的,那么我们就应该在重新关联之前,为标准输出文件重新分配一个句柄。这将使用到这样一个函数:

        int_dup( int handle );

        前面我也说了,标准输入文件本来的句柄是0,标准输出文件本来的句柄是1。而这个函数的功能就是为指定句柄的打开文件在分配第二个句柄(作为返回值返回)。这样分配了第二句柄后,当stdout指向其他文件时,原本的文件就不会被关闭,而是靠这个新分配的句柄保存管理了。当我们需要恢复原本的输出时,我们可以使用另一个函数:

        int _dup2( int handle1, int handle2 );

        它的功能是把handle2这个句柄强行关联到handle1所关联的文件,如果handle2本身关联着一个文件而这个文件没有其他句柄管理的话,这个文件将会被关闭。好了,有了这三个函数和我们在此同时形成的思路之后,我们就可以着手来完成我们的设想了:

        #include <stdio.h>
        #include <io.h>

        const char *outfile="out.txt";

        int main()
        {
         int hOut=_dup(1);                                             //用来保存第二句柄
          freopen(outfile,"w",stdout);                                //重新关联stdout文件指针
         printf("These will go to out.txt file ./n/n");
         printf("关于你操作系统的一些信息:/n");
         fflush(stdout);                                                    //刷新输出缓冲区
          system("systeminfo");
         _dup2(hOut,1);
         printf("These will go to console-window./n/n");
         fflush(stdout);
         system("pause");
         return 0;
         }

        好了,就这么简单就完成了我们输出重定向的构想,这里系统调用"systeminfo"命令,将得到一些你系统的信息,而这些信息将保存到你指定的文件中。好了,大家可以自己试试,也可以先把这个程序编译运行一下看看。记得在程序所在的文件夹下找名为"out.txt"的文件,打开看看里面的内容吧~

        输入重定向的原理和输出重定向类似,在这里就不再多做叙述了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值