gpt4 book ai didi

c - 为什么 fork() 通过 dup2() 关闭文件描述符之一

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:53:58 25 4
gpt4 key购买 nike

我编写代码是为了了解 dup2()。

int main(int argc, char* argv[]) {
FILE *fp = fopen(argv[1],"r");
int fdold,fdnew;
fdold = fileno(fp);
fdnew = dup2(fdold,fdnew);
while (1) {
sleep(1000);
}
}

lsof 显示 2 个打开的文件描述符(/workspace/source/throw.cpp 是传入的参数)

/workspace/source/thread$ lsof -p 20779
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
dup2 20779 wto cwd DIR 8,1 4096 946031 /workspace/source
dup2 20779 wto rtd DIR 8,1 4096 2 /
dup2 20779 wto txt REG 8,1 8672 950259 /workspace/source/dup2
dup2 20779 wto mem REG 8,1 1852120 135869 /lib/x86_64-linux-gnu/libc-2.17.so
dup2 20779 wto mem REG 8,1 149312 135845 /lib/x86_64-linux-gnu/ld-2.17.so
dup2 20779 wto 0u CHR 136,4 0t0 7 /dev/pts/4
dup2 20779 wto 1u CHR 136,4 0t0 7 /dev/pts/4
dup2 20779 wto 2u CHR 136,4 0t0 7 /dev/pts/4
dup2 20779 wto 3r REG 8,1 653 951057 /workspace/source/throw.cpp
dup2 20779 wto *767r REG 8,1 653 951057 /workspace/source/throw.cpp

但是,当我将它 fork() 到 2 个进程(代码如下)时,只有一个/workspace/source/throw.cpp 打开。

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

int main(int argc, char* argv[]) {
FILE *fp = fopen(argv[1],"r");
int fdold,fdnew;
fdold = fileno(fp);
//fcntl(F_DUPFD_CLOEXEC,fdold);
fdnew = dup2(fdold,fdnew);
pid_t pid;
if ((pid = fork()) < 0) {
exit(-1);
} else if (pid > 0) {
waitpid(pid, WNOHANG, NULL);
printf("parent exit\n");
} else {
while (1) {
sleep(1000);
}
}
return 0;
}
  1. 问题 1:是什么导致 dup()d fd 被关闭?
  2. 问题 2:我查看了手册中的 FD_CLOEXEC,但没有通过 fcntl() 设置它。 fopen() 会自动设置吗?这个标志不仅影响 fork 还影响 exec 系列吗?
  3. 问题3:我用dup替换dup2后,结果显示2个fds,符合我的预期。正如手册所说:

    "dup2() makes newfd be the copy of oldfd, closing newfd first if necessary".

    如果newfd已经打开,是否意味着在dup之前关闭newfd?

最佳答案

您的代码有一个错误(在设置它之前使用了 fdnew 的值),因此它的行为将不可预测。在你试图理解程序在做什么之前修复错误。此外,您应该检查 dup2 的返回值以查看它是否成功。

关于c - 为什么 fork() 通过 dup2() 关闭文件描述符之一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23862482/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com