第二个scanf在下面的代码中如何工作
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int main()
{
char buf[256];
int i;
write(1, "Hello World\n", strlen("Hello World\n"));
dup(0);
close(0);
scanf("%s", buf);
printf("Buffer:%s\n", buf);
dup(3);
scanf("%s", buf);
printf("Buffer:%s\n", buf);
return 0;
}
我们正在关闭标准输入(fd:0),那么dup(3)如何重新打开标准输入?
[我认为,当您检查dup的这两次调用的返回值时,您会发现第一个为3,第二个为0。因此,在调用第二个scanf函数之前,文件描述符0再次与终端相关。] >
dup
的文档说,它对新描述符使用“编号最小的未使用文件描述符”。由于您刚刚关闭FD 0,因此下次使用dup
时,0将是编号最小的未使用文件描述符,因此这就是重复FD的结局。并且由于您完全放回了摆脱的内容,因此scanf
很乐意在此之后再次工作。