linux - dup2 在这种情况下实际上做了什么?

标签 linux linux-kernel

这里我需要澄清一下: 我有一些这样的代码:

child_map[0] = fileno(fd[0]);
..
pid = fork();
if(pid == 0)
/* child process*/
dup2(child_map[0], STDIN_FILENO);

现在,STDIN_FILENO 和 child_map[0] 会指向同一个文件描述符吗? future 的输入是否会取自 child_map[0] 和 STDIN_FILENO 指向的文件? 我认为 STDIN_FILENO 表示标准输出(终端)。

最佳答案

dup2() 之后,child_map[0]STDIN_FILENO 将继续作为独立的文件描述符 ,但它们将引用相同的打开文件描述。这意味着,例如,如果 child_map[0] == 5STDIN_FILENO == 0,则文件描述符 50 将在 dup2() 之后保持打开状态。

引用相同的打开文件描述意味着文件描述符是可互换的——它们共享属性,如当前文件偏移量。如果您对一个文件描述符执行 lseek(),则两个文件的当前文件偏移量都会更改。

要关闭打开的文件描述,必须关闭指向它的所有文件描述符。

dup2() 之后执行 close(child_map[0]) 是很常见的,它只留下一个打开文件的文件描述符。

关于linux - dup2 在这种情况下实际上做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6686497/

相关文章:

linux - af_packet.ko 应该自动加载吗?

regex - 用 sed 替换控制字符

linux - 如何在 Ubuntu 启动时加载自定义模块?

linux - 如何唤醒内核中的用户态 sleep 进程?

linux - "Read"每行跳过最后一个字

linux - 将两个 asp.net 核心应用程序部署到 nginx 的一个解决方案中

php - 从 PHP 脚本启动 FOREVER 或 PM2 作为 WWW-DATA

linux - 我的自旋锁有问题吗?

linux - `do_new_mount_fc()`如何挂载像ext4这样的真实文件系统?

linux - 查看正在运行的进程的 stdin/stdout/stderr - Linux 内核