dup和dup2

功能:复制一个文件描述符

#include <unistd.h>

int dup(int oldfd);

int dup2(int oldfd , int newfd);

dup:不是原子操作

dup2:是原子操作

If oldfd is not a valid file descriptor, then the call fails, and newfd is not closed.

当旧fd不是一个有效的文件描述符,那么调用失败,新的描述符不会关闭。

If oldfd is a valid file descriptor, and newfd has the same value as oldfd, then dup2() does nothing,and returns newfd.

当旧fd是个有效的描述符,新描述符和旧文件描述符值相同,但么dup2不操作,返回新文件描述符。

#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define FNAME   "/tmp/out"

int main()
{
    int fd ;
    fd = open(FNAME , O_WRONLY | O_CREAT | O_TRUNC ,0600);
    if(fd < 0)
    {
        perror("open()");
        exit(1);
    }
    /******非原子操作*****/
    //close(1);
    //dup(fd);
    /********原子操作******/
    dup2(fd , 1 );
    if(fd !=1)
        close(fd);
    puts("hello");
    exit(0);
}
时间: 2024-09-29 06:08:22

dup和dup2的相关文章

dup和dup2函数

dup和dup2也是两个非常有用的调用,它们的作用都是用来复制一个文件的描述符.它们经常用来重定向进程的stdin.stdout和stderr.这两个函数的原形如下: #include <unistd.h> int dup( int oldfd ); int dup2( int oldfd, int targetfd ); dup()函数 利用函数dup,我们可以复制一个描述符.传给该函数一个既有的描述符,它就会返回一个新的描述符,这个新的描述符是传给它的描述符的拷贝.这意味着,这两个描述符共

Unix 网络编程 dup和dup2函数

dup和dup2也是两个非常有用的调用,它们的作用都是用来复制一个文件的描述符.它们经常用来重定向进程的stdin.stdout和stderr.这两个函数的原形如下: #include <unistd.h> int dup( int oldfd ); int dup2( int oldfd, int targetfd ); dup()函数: 利用函数dup,我们可以复制一个描述符.传给该函数一个既有的描述符,它就会返回一个新的描述符,这个新的描述符是传给它的描述符的拷贝.这意味着,这两个描述符

0723------Linux基础----------文件 IO 之 dup、dup2 和 fcntl 函数

1. dup 函数 1.1 dup 函数用来复制一个文件描述符,复制后的文件描述符可以正常使用(见例1).dup函数返回当前文件描述符表中一个最小的可用的文件描述符(Linux下分配文件描述符的规则是:寻找最小可用),这个过程由系统来完成.dup函数成功执行后,两个文件描述符fd_1 和 fd_2 指向同一个文件表项,因它们共享偏移量(文件数据结构图见Unix环境高级编程),在内核中的数据结构表示为:1个进程表项,1个文件表项(这里两个文件描述符指向同一个文件表项),1个V结点.文件表项中有一个

linux之dup和dup2函数解析

1. 文件描述符在内核中数据结构在具体说dup/dup2之前,我认为有必要先了解一下文件描述符在内核中的形态.一个进程在此存在期间,会有一些文件被打开,从而会返回一些文件描述符,从shell中运行一个进程,默认会有3个文件描述符存在(0.1.2), 0与进程的标准输入相关联,1与进程的标准输出相关联,2与进程的标准错误输出相关联,一个进程当前有哪些打开的文件描述符可以通过/proc/进程ID/fd目录查看. 下图可以清楚的说明问题:进程表项 ---------------- fd标志 文件指针

dup和dup2(摘 )

1.dup和dup2作用都是用来复制一个文件的描述符.它们常用来重定向进程的stdin.stdout和stderr.这两个函数的 原形如下: #include <unistd.h> int dup( int oldfd ); int dup2( int oldfd, int targetfd ) 利用函数dup,我们可以复制一个描述符.传给该函数一个既有的描述符,它就会返回一个新的描述符,这个新的描述符是传给它的描述符的拷 贝.这意味着,这两个描述符共享同一个数据结构.例如,如果我们对一个文件

Linux系统编程--文件描述符的复制dup()和dup2()【转】

本文转载自:http://blog.csdn.net/tennysonsky/article/details/45870459 dup() 和 dup2() 是两个非常有用的系统调用,都是用来复制一个文件的描述符,使新的文件描述符也标识旧的文件描述符所标识的文件. 这个过程类似于现实生活中的配钥匙,钥匙相当于文件描述符,锁相当于文件,本来一个钥匙开一把锁,相当于,一个文件描述符对应一个文件,现在,我们去配钥匙,通过旧的钥匙复制了一把新的钥匙,这样的话,旧的钥匙和新的钥匙都能开启这把锁.对比于 d

Linux系统编程——文件描述符的复制:dup()和dup2()

dup() 和 dup2() 是两个非常有用的系统调用,都是用来复制一个文件的描述符,使新的文件描述符也标识旧的文件描述符所标识的文件. 这个过程类似于现实生活中的配钥匙,钥匙相当于文件描述符,锁相当于文件,本来一个钥匙开一把锁,相当于,一个文件描述符对应一个文件,现在,我们去配钥匙,通过旧的钥匙复制了一把新的钥匙,这样的话,旧的钥匙和新的钥匙都能开启这把锁.对比于 dup(), dup2() 也一样,通过原来的文件描述符复制出一个新的文件描述符,这样的话,原来的文件描述符和新的文件描述符都指向

APUE之dup,dup2函数重定向标准输出实例

目的:重定向标准输出到一个文件之中. 定义这两个函数的头文件是 unistd.h  这个头文件同时定义了下面三个常量: * STDIN_FILENO = 0 标准输入 * STDOUT_FILENO = 1 标准输出 * STDERR_FILENO = 2 标准出错输出 dup和dup2函数 #include <unistd.h> int dup (int filedes); int dup2 ( int filedes,int filedes2); 两函数的返回值:若成功则返回新的文件描述符

dup与dup2函数

依赖的头文件 #include <unistd.h> 函数定义 int dup(int oldfd); int dup2(int oldfd, int newfd); 函数作用 dup和dup2都可用来复制一个现存的文件描述符,使两个文件描述符指向同一个file结构体. 如果两个文件描述符指向同一个file结构体,File Status Flag和读写位置只保存一份在file结构体中,并且file结构体的引用计数是2. 如果两次open同一文件得到两个文件描述符,则每个描述符对应一个不同的fi

UNIX 系统调用:dup,dup2实现重定向

重定向一般在命令行里就是把原本输出到屏幕的数据转而输出到一个指定的文件当中.如 1 $ pwd > workdir.txt 此时workdir.txt内就存储了pwd命令的输出,当前所在的工作目录 默认情况下printf总是把内容输出到进程的打开文件表述符编号为1的对应的文件中(0-标准输入,1-标准输出,2-标准错误输出),通过这些数字索引可以在进程的打开文件表中找到对应的项.实现输入输出重定向只要把标准输入输出对应的表项替换即可.可以通过dup,dup2系统调用进行.它们的作用都是把指定索引