我正在尝试理解dup2和dup的用法。
从手册页:
DESCRIPTION
dup and dup2 create a copy of the file descriptor oldfd.
After successful return of dup or dup2, the old and new descriptors may
be used interchangeably. They share locks, file position pointers and
flags; for example, if the file position is modified by using lseek on
one of the descriptors, the position is also changed for the other.
The two descriptors do not share the close-on-exec flag, however.
dup uses the lowest-numbered unused descriptor for the new descriptor.
dup2 makes newfd be the copy of oldfd, closing newfd first if necessary.
RETURN VALUE
dup and dup2 return the new descriptor, or -1 if an error occurred
(in which case, errno is set appropriately). 我为什么需要那个系统调用?复制文件描述符的用途是什么?
如果我有文件描述符,我为什么要复制它呢?
如果您能解释一下,并给我一个需要dup2 / dup的例子,我将不胜感激。
谢谢
发布于 2012-07-25 01:20:57
dup系统调用复制现有的文件描述符,返回引用相同底层I/O对象的新描述符。
Dup允许shell实现如下命令:
ls existing-file non-existing-file > tmp1 2>&12>&1告诉外壳程序为命令提供一个文件描述符2,它是描述符1的副本(即stderr & stdout指向相同的fd)。
现在,在tmp1文件中显示了对不存在的文件调用ls的错误消息以及对现有文件调用ls的正确输出。
下面的示例代码使用连接到管道的读取端的标准输入运行程序wc。
int p[2];
char *argv[2];
argv[0] = "wc";
argv[1] = 0;
pipe(p);
if(fork() == 0) {
close(STDIN); //CHILD CLOSING stdin
dup(p[STDIN]); // copies the fd of read end of pipe into its fd i.e 0 (STDIN)
close(p[STDIN]);
close(p[STDOUT]);
exec("/bin/wc", argv);
} else {
write(p[STDOUT], "hello world\n", 12);
close(p[STDIN]);
close(p[STDOUT]);
}子进程将读取端复制到文件描述符0上,关闭p中的文件描述符,并执行wc。当wc从其标准输入读取时,它从管道读取。
这就是使用dup实现管道的方式,好吧,dup的一种用法现在你使用管道来构建其他东西,这就是系统调用的美妙之处,你使用现有的工具构建一个又一个东西,这些工具反过来是使用其他东西构建的,等等。最后,系统调用是内核中最基本的工具
干杯:)
发布于 2012-07-25 01:53:10
复制文件描述符的另一个原因是将其与fdopen一起使用。fclose关闭了传递给fdopen的文件描述符,所以如果您不想关闭原始文件描述符,则必须先用dup复制它。
发布于 2012-07-25 00:27:53
dup用于重定向进程的输出。
例如,如果要保存进程的输出,可以复制输出(fd=1),将复制的fd重定向到一个文件,然后派生并执行进程,当进程完成时,再次将保存的fd重定向到输出。
https://stackoverflow.com/questions/11635219
复制相似问题