dup() 系统调用的解释
explanation of the dup() system call
当涉及到复制文件描述符时,我能得到一个关于 dup() 函数的非常简单的解释吗?
我想使用管道,但我还必须使 child 从管道读取(这是简单的部分),但将数据写回 parent。
我应该使用另一根管道,还是可以使用相同的管道?
来自man page:
The dup() system call creates a copy of the file descriptor oldfd,
using the lowest-numbered unused descriptor for the new descriptor.
您可以将其视为创建别名。如果调用成功,您将有两个 file descriptors 引用相同的资源(文件、管道或其他资源)。
对于通过管道与子进程通信的用例,您不必使用 dup
。您需要做的就是调用 pipe, fork 并关闭子进程和父进程中未使用的管道末端。
dup()(以及 dup2() 和 dup3())创建重复的文件描述符。
使用一个参数 dup(),OS 选择一个空闲的文件描述符编号,并使其成为传递的文件描述符的副本:
int dup_of_fd = dup(int fd);
使用两个参数 dup2() 它完全相同,除了你告诉它你想要用作副本的文件描述符号。如果它已经在使用中(如果在这个例子中 10 已经在使用中)那么它(这里是 10)被关闭并作为副本重新打开:
int dup_of_fd = dup2(fd, 10);
使用三个参数 dup3()(Linux 特定)它与 dup2() 相同,只是您可以传递 flags/options.
在所有情况下,新的(复制的)文件描述符将与旧的不同,但读取或写入两者将完全相同。
请注意,当从 2 个重复的文件描述符中读取时,查找位置是共享的,因此如果您打开一个文件并将 fd 复制为 dup_of_fd,然后从 fd 中读取 10 个字节,然后从 [= 中读取 10 个字节25=],从 dup_of_fd 读取的字节将是字节 11 到 20,即使它是从该文件描述符编号读取的第一个字节。
当涉及到复制文件描述符时,我能得到一个关于 dup() 函数的非常简单的解释吗? 我想使用管道,但我还必须使 child 从管道读取(这是简单的部分),但将数据写回 parent。 我应该使用另一根管道,还是可以使用相同的管道?
来自man page:
The dup() system call creates a copy of the file descriptor oldfd, using the lowest-numbered unused descriptor for the new descriptor.
您可以将其视为创建别名。如果调用成功,您将有两个 file descriptors 引用相同的资源(文件、管道或其他资源)。
对于通过管道与子进程通信的用例,您不必使用 dup
。您需要做的就是调用 pipe, fork 并关闭子进程和父进程中未使用的管道末端。
dup()(以及 dup2() 和 dup3())创建重复的文件描述符。
使用一个参数 dup(),OS 选择一个空闲的文件描述符编号,并使其成为传递的文件描述符的副本:
int dup_of_fd = dup(int fd);
使用两个参数 dup2() 它完全相同,除了你告诉它你想要用作副本的文件描述符号。如果它已经在使用中(如果在这个例子中 10 已经在使用中)那么它(这里是 10)被关闭并作为副本重新打开:
int dup_of_fd = dup2(fd, 10);
使用三个参数 dup3()(Linux 特定)它与 dup2() 相同,只是您可以传递 flags/options.
在所有情况下,新的(复制的)文件描述符将与旧的不同,但读取或写入两者将完全相同。
请注意,当从 2 个重复的文件描述符中读取时,查找位置是共享的,因此如果您打开一个文件并将 fd 复制为 dup_of_fd,然后从 fd 中读取 10 个字节,然后从 [= 中读取 10 个字节25=],从 dup_of_fd 读取的字节将是字节 11 到 20,即使它是从该文件描述符编号读取的第一个字节。