`
fanrey
  • 浏览: 255046 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

dup和dup2

 
阅读更多
名称::
dup/dup2

目标:
复制一个现存的文件描述符.

头文件:
#include <unistd.h>

函数原形:
int dup(int oldfd)

int dup2(int oldfd,int newfd)

参数:
oldfd    原有文件描述符

newfd   新的文件描述符

返回值:
-1      遇到错误

int      新文件描述符




  系统调用dup是用来复制一个文件描述符,也就是将进程u区的文件描述符表中的一项复制一份,使得这两项同时指向系统稳健表的同一表项。

  系统调用dup复制由参数oldfd指定的文件描述到进程文件描述符表的第一个空表项处。而系统调用dup2复制由参数oldfd指定的文件描述到参数newfd指定的文件描述符表项处。老的文件描述符和新复制的文件描述符可以互换使用。它们共享锁、文件指针和文件状态。例如,对其中一个文件描述符使用系统调用lseek修改文件指针的位置,对另一文件描述符来说文件指针也改变了,其实我们了解了内核的工作原理,这一点很容易理解。因为我们知道,文件指针是放在系统文件表中的。但这两个文件描述符具有不同的close-on-exec标志,因为该标志是存放在文件描述符表中的。

  该调用成功时,返回值为新的描述符;错误时,返回-1,并设置相应的错误代码errno:

EBADF:参数oldfd不是一个已经打开的文件描述符;或者参数newfd超出允许的文件描述符的取值范围。
EMFILE:进程打开的文件描述符数量已经到达最大值,但仍然企图打开新的文件描述符。
  下面我们来看一个简单的例子。在这个例子中,我们将标准输出(文件描述符为1)关闭,并将一个打开了普通文件“output”的文件描述符复制到标准输出上,因为刚关闭了文件描述符1,所以,文件描述符表的第一个空表项是1。所以,程序以后的printf等向标准输出写的内容都写到了文件中。

利用这个功能我们可以把输出/输入重定向到文件中。下面是一个例子。





#include <stdio.h>

#include <unistd.h>

#include <systypes.h>

#include <sys/stat.h>

#include <string.h>

#include <errno.h>

#include <fcntl.h>



main(int argc,char *argv[])
{
      int fd;
      if ((fd=open(argv[1],O_CREAT|O_RDWR,0644))==-1)
            printf("cannot open output file ");


     close(1);     

       if(dup(fd)==-1);
          perror(“error”);

close(fd);
      printf("This line will write to file ");
}

  该程序执行过程的屏幕拷贝:

      [wap@wapgw /tmp]$ gcc -o 1_5 1_5.c
      [wap@wapgw /tmp]$ ./1_5 test1
      [wap@wapgw /tmp]$ more test1
      This line will write to file






dup2的功能和dup基本相同,只不过是dup2复制oldfd到newfd上。下面是用dup2实现同样的例子。





#include <stdio.h>

#include <unistd.h>

#include <systypes.h>

#include <sys/stat.h>

#include <string.h>

#include <errno.h>

#include <fcntl.h>



main(int argc,char *argv[])

{

int fd;

if((fd=open(argv[1],O_WRONLY|O_CREAT,0644))==-1)

    perror(“error”);

close(1);

if(dup2(fd,1)==-1)

    perror(“error”);

close(fd);

printf(“This line will write to file \n”);

close(fd);



}



分享到:
评论

相关推荐

    UNIX编程中的dup和dup2说明

    UNIX 编程中的 dup 和 dup2 说明 UNIX 编程中的 dup 和 dup2 函数是两个非常有用的系统调用,它们的作用都是用来复制一个文件的描述符。它们经常用来重定向进程的 stdin、stdout 和 stderr。 dup 函数的原型为 `...

    dup_dup2介绍

    在Linux操作系统中,`dup`和`dup2`是两个重要的系统调用,它们与文件描述符管理和进程间通信紧密相关。本文将详细介绍这两个函数的工作原理、使用场景以及如何用C语言实现它们。 首先,我们来看`dup`系统调用。`dup...

    文件描述符的复制:dup()和dup2()示例代码

    本篇文章将深入探讨如何通过`dup()`和`dup2()`两个系统调用来复制文件描述符,并提供相关示例代码。 `dup()`函数是Linux提供的一个系统调用,它的主要作用是创建一个新的文件描述符,该描述符与已存在的一个文件...

    详细介绍dup2函数用法,一看必懂.。。。

    其中,`dup` 和 `dup2` 函数在处理文件描述符时非常有用。本文将深入探讨这两个函数的用途及其工作原理,特别是 `dup2` 的使用场景。 #### 二、文件描述符的概念 在Linux或Unix系统中,每个进程都会有一系列的文件...

    DUP414中文驱动

    总的来说,DUP414中文驱动是确保DUP-414设备在中文操作系统环境中正常运行的关键软件,而提供的压缩包文件则包含了安装和测试驱动所需的所有内容。用户只需按照正确的步骤操作,就能让设备充分发挥其功能,处理各种...

    dup 补丁 2.2汉化版

    7. **dup2.ini**:配置文件,存储用户的设置和自定义选项,补丁会根据这个文件中的信息来个性化用户的游戏体验。 8. **diablo2oo2's.wildcard.rules.ini**:可能是一份规则文件,用于定义游戏中的某些自定义规则...

    DUP 2.1 补丁编写工具

    在软件开发和维护过程中,补丁是修复程序错误、提升性能或增强功能的关键手段,DUP 2.1 提供了强大的功能来简化这一过程。 偏移量补丁主要针对二进制文件中的特定地址进行修改,通过指定原始值和目标值,可以在不...

    dup源代码dup

    dup函数在系统编写程序的用法 及源代码

    dup2.25内存补丁制作工具

    压缩包内的文件如dup2.exe是主程序,dup2.ini是配置文件,readme.txt包含了使用说明,plugins目录则包含可扩展插件,icons则存储了各种图标资源,这些都丰富了工具的功能并提供了便利。 在实际操作中,用户需要了解...

    dUP v2.17 Beta 23

    1. `dup2_help.chm`:这是帮助文件,通常以CHM(Compiled HTML Help)格式提供,用户可以通过它获取软件的使用指南和详细信息。 2. `DisasmEngineDLL.dll`:动态链接库文件,可能包含了反汇编引擎的代码,用于分析二...

    dup2 补丁工具

    经典的补丁工具,破解领域很有名的哦!!!!

    dup2 v2.18.3

    3.推荐喜欢自定义补丁颜色的朋友使用 cnhhkk 制作的 dUP2 的颜色辅助 设置工具 - dUP 2 Color Panel。 主页地址:http://cnhhkk.21windows.cn 镜像地址: http://vip.hanzify.org/tracky/dUP2ColorPanel.rar ...

    vb.net dup通信

    vb.net dup通信,含打洞技术,很有用,提供给大家学习。

    c++面试题网络编程篇

    本文总结了C++面试题网络编程篇中的重要知识点,包括dup和dup2函数、lseek函数、sync、fsync和fdatasync函数、fcntl函数、exit和_exit函数、setjmp和longjmp函数、记录锁、守护进程编程规范等。 1. dup和dup2函数 ...

    简要对比C语言中的dup()函数和dup2()函数

    在C语言中,`dup()`和`dup2()`都是用于复制文件描述符的函数,它们在处理进程的I/O操作时非常有用。文件描述符是操作系统分配给打开文件的唯一标识,通过它来读写文件。下面我们将详细介绍这两个函数的工作原理、...

    Dup2_v2.26_汉化版 专注于破解

    大牛路过别叨叨!专业破解。功能强大。灵活的利用dup/dup2可以给你带来很多强大的功能,花了一些时间总结出上面那么多,不知道自己理解的是否透彻,只能在以后的实践中慢慢探索了。

    dup2.19.beta

    在实际应用中,dup2常用于进程间通信(IPC)和管道等场景。例如,在创建子进程时,父进程可能会使用dup2来确保子进程继承特定的文件描述符,如标准输入、输出和错误。此外,dup2也可以用于实现所谓的“无名管道”,...

    diablo2oo2's Universal Patcher(DUP) v2.26.1 汉化版.rar

    - dup2.exe:这是DUP的主程序文件,负责运行和管理所有补丁操作。 - dup2.ini:配置文件,保存用户的设置和自定义选项。 - dup2_help.chm:帮助文件,提供了详细的使用指南和补丁说明。 - readme.txt:包含程序...

    Linux应用编程和网络编程

    dup和dup2函数的原型分别为int dup(int oldfd)和int dup2(int oldfd, int newfd),作用是复制文件描述符oldfd到newfd,如果newfd已经打开,则先关闭newfd再复制。 6. 标准IO库介绍 文档最后介绍了标准IO库,它与...

Global site tag (gtag.js) - Google Analytics