首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >有人能解释一下C中的dup()是做什么的吗?

有人能解释一下C中的dup()是做什么的吗?
EN

Stack Overflow用户
提问于 2011-10-23 02:12:53
回答 7查看 37.4K关注 0票数 25

我知道dup、dup2、dup3“创建文件描述符oldfd的副本”(来自手册页)。但是我不能消化它。

据我所知,文件描述符只是号,用于跟踪文件位置及其方向(输入/输出)的。不是更容易些吗

fd=fd2;

什么时候我们想复制一个文件描述符?

还有其他的..。

dup()对新的描述符使用编号最小的未使用描述符。

这是否意味着如果我们假设我们有-ed()close()其中之一,它也可以作为值stdin,stdout或stderr?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-10-24 22:49:29

我只是想在试验了一下之后对第二个问题做出回应。

答案是,是的,。如果stdin、stdout或stderr被关闭,则您创建的文件描述符可以采用值0、1、2。

示例:

close(1);     //closing stdout
newfd=dup(1); //newfd takes value of least available fd number

文件描述符发生这种情况的地方:

0 stdin     .--------------.     0 stdin     .--------------.     0 stdin
1 stdout   =|   close(1)   :=>   2 stderr   =| newfd=dup(1) :=>   1 newfd
2 stderr    '--------------'                 '--------------'     2 stderr
票数 20
EN

Stack Overflow用户

发布于 2011-10-23 02:54:37

文件描述符不仅仅是一个数字。它还带有各种半隐藏状态(无论它是否打开,它引用的是哪个文件描述,以及一些标志)。dup会复制此信息,因此您可以分别关闭这两个描述符。fd=fd2不需要。

票数 14
EN

Stack Overflow用户

发布于 2011-10-23 02:30:28

假设您正在编写一个shell程序,并且希望在要运行的程序中重定向stdin和stdout。它可能看起来像这样:

fdin = open(infile, O_RDONLY);
fdout = open(outfile, O_WRONLY);
// Check for errors, send messages to stdout.
...
int pid = fork(0);
if(pid == 0) {
    close(0);
    dup(fdin);
    close(fdin);
    close(1);
    dup(fdout);
    close(fdout);
    execvp(program, argv);
}
// Parent process cleans up, maybe waits for child.
...

dup2()是一种更方便的方法,close() dup()可以替换为:

dup2(fdin, 0);
dup2(fdout, 1);

这样做的原因是您希望将错误报告给stdout (或stderr),这样就不能在子进程中关闭它们并打开一个新文件。其次,如果open()调用返回错误,那么执行fork将是一种浪费。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7861611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档