当涉及到复制文件描述符时,我可以得到一个关于 dup() 函数的真正愚蠢的解释吗?我想使用管道,但我还必须让孩子从管道中读取(这是简单的部分),但将数据写回父级。我应该使用另一根管道,还是可以使用相同的管道?
问问题
1492 次
2 回答
5
dup()(以及 dup2() 和 dup3())创建重复的文件描述符。
操作系统使用一个参数 dup() 选择一个空闲的文件描述符编号,并使其成为传递的那个的副本:
int dup_of_fd = dup(int fd);
使用两个参数 dup2() 它是完全相同的,只是你告诉它你想用作副本的文件描述符编号。如果它已经在使用(如果在这个例子中 10 已经在使用)那么它(这里是 10)被关闭并作为副本重新打开:
int dup_of_fd = dup2(fd, 10);
使用三个参数 dup3()(特定于 Linux),它与 dup2() 相同,只是您可以传递标志/选项。
在所有情况下,新的(重复的)文件描述符与旧的文件描述符的编号不同,但读取或写入两者将完全相同。
请注意,当从 2 个重复的文件描述符中读取时,查找位置是 SHARED,因此如果您打开一个文件并将 fd 复制为 dup_of_fd,然后从 fd 读取 10 个字节,然后从 dup_of_fd 读取 10 个字节,则从 dup_of_fd 读取的字节将是字节 11到 20,即使它是从该文件描述符编号的第一次读取。
于 2015-10-27T22:42:13.733 回答