dup和dup2用法小结

摘要:
今天和同学探讨了一下关于重定向输出到文件的问题,其中需要用到dup和dup2函数,因此来小小的总结一下。首先来man一下:dup直接返回一个新的描述符和原来的描述符一样代表同一个资源,描述符的值就从当前未使用的最小的描述符来取。所以有以下程序:#include#include#include#definefile_name"dup_test_file"intmain{//先调用dup将标准输出拷贝一份,指向真正的标准输出intstdout_copy_fd=dup;intfile_fd=open;//让标准输出指向文件dup2;printf;//恢复标准输出dup2;printf;return0;}然而,调用的两次printf仍然出现在屏幕上。。

今天和同学探讨了一下关于重定向输出到文件的问题,其中需要用到dup和dup2函数,因此来小小的总结一下。

首先来man一下:

dup和dup2用法小结第1张

dup直接返回一个新的描述符和原来的描述符一样代表同一个资源,描述符的值就从当前未使用的最小的描述符来取。
而dup2则是可以指定描述符的值,这样通过把文件的描述符指定为STDOUT_FILENO,这样就相当于重定向输出为文件了。

所以有以下程序:

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#define file_name "dup_test_file"
int main(int argc, char *argv[])
{
    //先调用dup将标准输出拷贝一份,指向真正的标准输出
    int stdout_copy_fd = dup(STDOUT_FILENO);
    int file_fd = open(file_name, O_RDWR);
    //让标准输出指向文件
    dup2(file_fd, STDOUT_FILENO);
    printf("hello
");
    //恢复标准输出
    dup2(stdout_copy_fd, STDOUT_FILENO);
    printf("world
");
    return 0;
}

然而,调用的两次printf仍然出现在屏幕上。。hello并没有写入到文件中。
原因是:
第一次printf之后,这些字符串还在缓存中,然而之后将标准输出改回来之后,和再调用printf同时也把之前缓存也输出了,所以给人的感觉上是没有重定向成功。所以得加上这么一句

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#define file_name "dup_test_file"
int main(int argc, char *argv[])
{
    //先调用dup将标准输出拷贝一份,指向真正的标准输出
    int stdout_copy_fd = dup(STDOUT_FILENO);
    int file_fd = open(file_name, O_RDWR);
    //让标准输出指向文件
    dup2(file_fd, STDOUT_FILENO);
    printf("hello
");
    //刷新缓冲区
    fflush(stdout);
    //恢复标准输出
    dup2(stdout_copy_fd, STDOUT_FILENO);
    printf("world
");
    return 0;
}

此时只会输出world,同时hello写入到文件中

免责声明:文章转载自《dup和dup2用法小结》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇react-native常见错误整理python数据处理(二)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

树形DP+RMQ+单调队列(Bob’s Race HDU4123)

题意:有n个房子,这些房子被n-1条道路连接,有一些运动员从一个房子为起点尽可能跑最远的距离且不能通过一条道路超过两次,这些运行员不能选择同样的起点,这些运动员跑的最远距离和最近距离的差值不能超过Q,这些运行员的起点房间编号都是连续的,问最多可以选择多少个运动员跑步? 分析:就是给出一颗树形图,先用dp求出每个点所能经过的最远距离,然后用rmq求区间最值,...

在WindowsXP下 VC6.0 编译安装Boost库 Step by Step CHRIS

要使用例如正则表达式类的话就需要编译了。为了不浪费自己High的心情,我还是决定完全编译一下Boost库。首先从Boost的老巢http://www.boost.org/下载。下载完成以后是一个安装文件(其实就是进行自动解压缩的)。选择你的目录解压缩Boost库。然后我们开始对其进行编译我所下载的版本是1.33.1。 1.cmd 2.进入安装VC的目录例如...

C++ RS-485通讯示例

RS-485是一种半双工的通信协议,经常用于工业控制模块间的通信,因其传输距离远,不容易出错的特点,应用广泛。 此为windows下示例,linux需做相应修改。 #pragma once #include <windows.h> #include <stdio.h> #include <stdlib.h> class...

printf()函数不能直接输出string类型

因为string不是c语言的内置数据,所以直接printf输出string类型的是办不到的。 要这样输出: printf("%s ",a.c_str()); 举例: #include<bits/stdc++.h> using namespacestd; intmain(){ string a="人生"; printf("%s "...

opencv配置过程 (cmake,vs2013,qt 5.4)

平台及软件: Windows 7 X86 Visual Studio 2013 OpenCV3.0.0 Cmake3.3 1、下载Windows下的安装文件OpenCV-3.0.0.exe,解压,选择需要的安装目录即可。(本文为F:\opencv) 注意相应的目录不能包含中文。 2、Cmake编译 执行CMake,用于把OpenCV的源码生成对应的VS工程...

linux高编信号-------令牌桶实现

main.c /********************************* *功能:每秒从文件读N个字节(N可控) *使用信号机制实现令牌桶:解决数据流不均匀传输 * *****************************/ #include <stdio.h> #include <stdlib.h>...