dup()系统调用的说明

时间:2015-10-27 22:25:40

标签: linux pipe dup

当复制文件描述符时,我能否对dup()函数有一个非常愚蠢的解释? 我想使用管道,但我还必须让孩子从管道中读取(这是容易的部分),但是将数据写回父级。 我应该使用其他管道,还是可以使用同一管道?

2 个答案:

答案 0 :(得分:4)

dup()(和dup2()和dup3())创建重复的文件描述符。

使用一个参数dup(),操作系统会选择一个免费的文件描述符编号,并使其与传递的文件描述符重复:

int dup_of_fd = dup(int fd);

使用两个参数dup2()它是完全相同的,除了你告诉它你想要用作副本的文件描述符号。如果它已经在使用中(如果在这个例子中已经使用了10)那么它(这里是10)将被关闭并重新打开作为副本:

int dup_of_fd = dup2(fd, 10);

使用三个参数dup3()(特定于Linux)它与dup2()相同,除了你可以传递flags / options。

在所有情况下,新的(重复的)文件描述符将与旧的不同,但对两者的读取或写入将完全相同。

请注意,当从2个重复的文件描述符中读取时,搜索位置为SHARED,因此如果您打开文件并将fd复制为dup_of_fd,则从fd读取10个字节,然后从dup_of_fd读取10个字节,从dup_of_fd读取的字节将是字节11到20,即使它是从该文件描述符编号的第一次读取。

答案 1 :(得分:2)

来自man page

  

dup()系统调用创建文件描述符oldfd的副本,   使用编号最小的未使用描述符作为新描述符。

您可以将其视为创建别名。如果调用成功,您将有两个file descriptors引用相同的资源(文件,管道或其他内容)。

对于通过管道与子进程通信的用例,您不必使用dup。您需要做的就是调用pipefork并在子进程和父进程中关闭管道的未使用端。