我知道dup、dup2、dup3“创建文件描述符oldfd的副本”(来自手册页)。但是我不能消化它。
据我所知,文件描述符只是号,用于跟踪文件位置及其方向(输入/输出)的。不是更容易些吗
fd=fd2;
什么时候我们想复制一个文件描述符?
还有其他的..。
dup()对新的描述符使用编号最小的未使用描述符。
这是否意味着如果我们假设我们有-ed()close()其中之一,它也可以作为值stdin,stdout或stderr?
发布于 2011-10-24 22:49:29
我只是想在试验了一下之后对第二个问题做出回应。
答案是,是的,。如果stdin、stdout或stderr被关闭,则您创建的文件描述符可以采用值0、1、2。
示例:
close(1); //closing stdout
newfd=dup(1); //newfd takes value of least available fd number
文件描述符发生这种情况的地方:
0 stdin .--------------. 0 stdin .--------------. 0 stdin
1 stdout =| close(1) :=> 2 stderr =| newfd=dup(1) :=> 1 newfd
2 stderr '--------------' '--------------' 2 stderr
发布于 2011-10-23 02:54:37
文件描述符不仅仅是一个数字。它还带有各种半隐藏状态(无论它是否打开,它引用的是哪个文件描述,以及一些标志)。dup
会复制此信息,因此您可以分别关闭这两个描述符。fd=fd2
不需要。
发布于 2011-10-23 02:30:28
假设您正在编写一个shell程序,并且希望在要运行的程序中重定向stdin和stdout。它可能看起来像这样:
fdin = open(infile, O_RDONLY);
fdout = open(outfile, O_WRONLY);
// Check for errors, send messages to stdout.
...
int pid = fork(0);
if(pid == 0) {
close(0);
dup(fdin);
close(fdin);
close(1);
dup(fdout);
close(fdout);
execvp(program, argv);
}
// Parent process cleans up, maybe waits for child.
...
dup2()是一种更方便的方法,close() dup()可以替换为:
dup2(fdin, 0);
dup2(fdout, 1);
这样做的原因是您希望将错误报告给stdout (或stderr),这样就不能在子进程中关闭它们并打开一个新文件。其次,如果open()调用返回错误,那么执行fork将是一种浪费。
https://stackoverflow.com/questions/7861611
复制相似问题