首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用dup或dup2的实际示例

使用dup或dup2的实际示例
EN

Stack Overflow用户
提问于 2009-11-12 15:33:24
回答 4查看 99.5K关注 0票数 68

我知道dup / dup2是做什么的,但我不知道什么时候会用到它。

有什么实际的例子吗?

谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-11-12 15:44:31

一个例子是I/O重定向。为此,您派生一个子进程并关闭stdin或stdout文件描述符(0和1),然后对您选择的另一个filedescriptor执行dup(),该文件描述符现在将映射到最低可用文件描述符,在本例中为0或1。

使用它,您现在可以执行任何可能不知道您的应用程序的子进程,并且无论何时子进程在stdout上写入(或从stdin读取,无论您配置了什么),数据都会写入所提供的filedescriptor。

Shell使用它来通过管道实现命令,例如,通过将一个进程的标准输出连接到另一个进程的标准输入来实现/bin/ls | more

票数 68
EN

Stack Overflow用户

发布于 2009-11-12 15:44:50

当您对POSIX函数感到好奇时,尤其是那些似乎会自我复制的函数,使用check the standard itself通常是好的。在底部,您通常会看到示例,以及两者实现(和存在)背后的推理。

在这种情况下:

以下各节是信息性的。

示例

将标准输出重定向到文件

下面的示例关闭当前进程的标准输出,重新分配标准输出以转到pfd引用的文件,并关闭原始文件描述符以进行清理。

#include <unistd.h>
...
int pfd;
...
close(1);
dup(pfd);
close(pfd);
...

重定向错误消息

下面的示例将消息从stderr重定向到stdout

#include <unistd.h>
...
dup2(2, 1); // 2-stderr; 1-stdout
...

应用程序使用情况

没有。

基本原理

dup()dup2()函数是冗余的。它们的服务也由fcntl()函数提供。由于历史原因,它们被包含在IEEE标准1003.1-2001年的这一卷中,因为许多现有的应用程序都在使用它们。

虽然所示的简短代码段在行为上与dup2()非常相似,但基于IEEE标准1003.1-2001年这一卷中定义的其他函数的一致性实现要复杂得多。最不明显的是信号捕获函数的可能效果,该函数可以在步骤之间调用,并分配或释放文件描述符。这可以通过阻塞信号来避免。

没有将dup2()函数标记为过时,因为它提供了由fcntl()在类型不安全的版本中提供的功能的类型安全版本。它用在POSIX Ada绑定中。

dup2()函数不适合在关键区域中作为同步机制使用。

在EBADF的描述中,给定的文件无效的情况涵盖了文件超出范围的情况。对fildesfildes2的描述是不同的,因为与fildes2相关的唯一一种无效性是它是否超出范围;也就是说,在进行dup2()调用时,fildes2是否引用打开的文件并不重要。

未来方向

没有。

另请参阅

close()fcntl()open(),IEEE标准1003.1-2001年基本定义卷,<unistd.h>

更改历史记录

第一次发布在第1期。派生自SVID的第1期。

票数 10
EN

Stack Overflow用户

发布于 2009-11-12 16:24:51

一个实际的例子是将输出消息重定向到其他流,比如一些日志文件。以下是I/O重定向的示例代码。

请参考原文here

#include <stdio.h>

main()
{
    int    fd;
    fpos_t pos;

    printf("stdout, ");

    fflush(stdout);
    fgetpos(stdout, &pos);
    fd = dup(fileno(stdout));
    freopen("stdout.out", "w", stdout);

    f();

    fflush(stdout);
    dup2(fd, fileno(stdout));
    close(fd);
    clearerr(stdout);
    fsetpos(stdout, &pos);        /* for C9X */

    printf("stdout again\n");
}

f()
{
printf("stdout in f()");
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1720535

复制
相关文章

相似问题

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