Linux重定向的系统调用方法

本文介绍如何通过dup2函数将程序的标准输出重定向到一个文件中,利用此方法可以改变程序原本输出到屏幕的内容,使其输出到指定的文件内。文章通过一个具体的C语言示例程序展示了这一过程,并解释了dup2与fcntl在特定情况下如何达到相同的效果。
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>


#define ERR_EXIT(m) \
        do \
        { \
                perror(m); \
                exit(EXIT_FAILURE); \
        } while (0)

int main(int argc, char *argv[])
{
        int fd;
        fd = open("test.txt", O_WRONLY | O_CREAT);
        if (fd == -1)
                ERR_EXIT("open error");

/*      close(1);
        dup(fd);
*/
        dup2(fd, 1);
        printf("hello\n");
        return 0;
}

注视部分与dup2的函数相同,1默认代表标准的输出,dup是寻找空闲的文件描述符来进行复制,这时fd就指向了标准输出,所以原本输出到控制台的字符“hello”就输出到了test.txt文件中,dup2也是同样的道理。

或者注视掉dup2函数以fcntl函数也可以实现:

        close(1);
        if( fcntl(fd, F_DUPFD, 0) < 0)
                ERR_EXIT("fcntl error");

F_DUPFD表示从指定的起始位置(这里为0)开始搜索可用的文件描述符,dup函数默认从0开始搜索,这就是它们在这里等价的原因。

Linux操作之输入输出重定向和管道 作者:佚名 出处:中国自学编程网收集整理 发布日期:2008-07-12   Unix下使用标准输入stdin和标准输出stdout,来表示每个命令的输入和输出,还使用一个标准错误输出stderr用于输出错误信息。这三个标准输入输出系统缺省与控制终端设备相联系在一起的。因此,在标准情况下,每个命令通常从它的控制终端中获取输入,将输出打印到控制终端的屏幕上。      但是也可以重新定义程序的输入 stdin和输出stdout,将它们重新定向。最基本的用法是将她们重新定义到一个文件上去,从一个文件获取输入,输出到另外的文件中等。      $ ls > ls.out      $ cat < ls.out      这种输入输出重定向带来了极大的灵活性,可以将输出结果记录下来,也可以将程序所需要的输入使用文件提前准备就绪,这样一来多次执行就不需要重新输入。      $ echo “ today is “ > out      $ date >> out      使用 >>标记表示输出结果采用添加的方式,将结果附加在文件out后面,而不是简单的将原有文件重新覆盖的方式。      更为灵活的方式是将输入输出和一个执行命令联系起来,而不是一个固定的文件。      $ ls -l | grep mbox   上面的命令,将 ls -l的输入作为grep的输入,这种方式称为管道。Unix提供了很多功能强大的小命令,但使用管道将这些命令组合起来,就形成了非常强大的工具组合,能完成非常复杂的工作。      Unix系统提供了一些特殊的设备文件,用在一些特殊情况下。例如一个特殊设备文件为/dev/null,永远无法写满,写入的内容被系统立即丢弃。如果不想看到程序的输出,可以使用它作输出。      $ make world > /dev/null   去除了屏幕输出,使整个程序执行过程非常平静。   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值