有人可以解释C中的dup()吗?

Pit*_*kos 20 c pipe dup2 dup

我知道dup,dup2,dup3" 创建文件描述符oldfd的副本 "(来自手册页).但是我无法消化它.

据我所知文件描述符只是数字来跟踪文件的位置和它们的方向(输入/输出).是不是更容易

fd=fd2;
Run Code Online (Sandbox Code Playgroud)

每当我们想复制文件描述符?

还有别的......

dup()使用编号最小的未使用描述符作为新描述符.

这是否意味着它还可以作为值stdin,stdoutstderr,如果我们假设我们有close() -其中一个?

Pit*_*kos 16

只是想在尝试一下之后回答第二个问题.

答案是肯定的.如果stdin,stdout或stderr关闭,则您创建的文件描述符可以取值0,1,2.

例:

close(1);     //closing stdout
newfd=dup(1); //newfd takes value of least available fd number
Run Code Online (Sandbox Code Playgroud)

文件描述符发生的地方:

0 stdin     .--------------.     0 stdin     .--------------.     0 stdin
1 stdout   =|   close(1)   :=>   2 stderr   =| newfd=dup(1) :=>   1 newfd
2 stderr    '--------------'                 '--------------'     2 stderr
Run Code Online (Sandbox Code Playgroud)


n. *_* m. 12

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

  • @dmckee:"内核"和"索引"是实现细节.有一些与"数字"相关的数据不能由程序直接操作,而是由`dup()`克隆.这是程序员需要知道的全部内容.顺便说一下,它不是一个非常有趣的数据,它只是一些标志和真正有趣的数据(开放文件描述)的索引,它不是由'dup()`克隆的. (3认同)

SzG*_*SzG 6

关于dup()最重要的一点是它返回可用于新文件描述符的最小整数.这是重定向的基础:

int fd_redirect_to = open("file", O_CREAT);
close(1); /* stdout */
int fd_to_redirect = dup(fd_redirect_to); /* magically returns 1: stdout */
close(fd_redirect_to); /* we don't need this */
Run Code Online (Sandbox Code Playgroud)

在此之后写入文件描述符1(stdout)的任何东西,神奇地进入"文件".


Ric*_*ton 5

假设你正在编写一个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.
...
Run Code Online (Sandbox Code Playgroud)

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

dup2(fdin, 0);
dup2(fdout, 1);
Run Code Online (Sandbox Code Playgroud)

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