当复制文件描述符时,我能否对dup()函数有一个非常愚蠢的解释? 我想使用管道,但我还必须让孩子从管道中读取(这是容易的部分),但是将数据写回父级。 我应该使用其他管道,还是可以使用同一管道?
答案 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
。您需要做的就是调用pipe,fork并在子进程和父进程中关闭管道的未使用端。