名称::
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说明
在linux中实现dup以及dup2,用C语言实现,里面有可执行文件,直接运行
Linux系统编程——文件描述符的复制:dup()和dup2(),相关教程如下: http://blog.csdn.net/tennysonsky/article/details/45870459
dup函数在系统编写程序的用法 及源代码
详细介绍dup2函数用法,一看必懂.。。。
经典的补丁工具,破解领域很有名的哦!!!!
3.推荐喜欢自定义补丁颜色的朋友使用 cnhhkk 制作的 dUP2 的颜色辅助 设置工具 - dUP 2 Color Panel。 主页地址:http://cnhhkk.21windows.cn 镜像地址: http://vip.hanzify.org/tracky/dUP2ColorPanel.rar ...
vb.net dup通信,含打洞技术,很有用,提供给大家学习。
DUP-414中文驱动,希望能有需要的同学
dUP v2.17 Beta 23 汉化版 by tracky
大牛路过别叨叨!专业破解。功能强大。灵活的利用dup/dup2可以给你带来很多强大的功能,花了一些时间总结出上面那么多,不知道自己理解的是否透彻,只能在以后的实践中慢慢探索了。
from command line, you input ./direction inputfile outputfile, to practice how to use dup() or dup2()
DUP服务端代码——UDPServer.py
2.2最新版的哦。汉化过的,非汉化站的东西
主程序:dup2.exedup2即diablo2oo2's Universal Patcher,本版本为简体中汉化版,它是一款非常好用的补丁制作工具,功能强大,编辑后可以即时生成补丁或生成Loader,你可以根据需要来自定义设置皮肤,生成的补丁...
此新的文件描述词和参数oldfd 指的是同一个文件, 共享所有的锁定、读写位置和各项权限或旗标. 例如, 当利用lseek()对某个文件描述词作用时, 另一个文件描述词的读写位置也会随着改变. 不过, 文件描述词之间并不共享...
6.3 dup和dup2系统调用 6.4 一个真正的shell 6.5 非重定向管道的双向通信 6.6 用双向管道进行双向通信 练习 第7章 高级进程间通信 7.1 概述 7.2 FIFO或命名管道 7.3 抽象的简单消息接口(sMI) 7.4 SystemVIPC 7.5 ...
使用fork(),exec(),dup2(), pipe(),open()系统调用完成与下列shell命令等价的功能:grep -v usr | wc -l > result.txt
2.对于TCP,支持服务器和客户端模式。 3.支持多连接,可同时对多路网络连接进行操作。 4.对于UDP,支持组播方式。 5.可显示当前数据传输速度。 6.数据显示方式分为16进制和TEXT两种。 7.可发送文件。 8.可把接收到的...