第二个扫描在下面的代码中是如何工作的
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int main()
{
char buf[256];
int i;
write(1, "Hello Worldn", strlen("Hello Worldn"));
dup(0);
close(0);
scanf("%s", buf);
printf("Buffer:%sn", buf);
dup(3);
scanf("%s", buf);
printf("Buffer:%sn", buf);
return 0;
}
我们正在关闭 stdin (fd:0(, 那么 dup(3( 如何具有重新打开 stdin 的效果呢?
我认为当你检查这两个 dup 调用的返回值时,你会发现第一个是 3,第二个是 0。因此,在调用第二个scanf函数之前,文件描述符0再次与终端相关。
dup
的文档说它使用"新描述符的最低编号未使用的文件描述符"。由于您刚刚关闭了 FD 0,因此下次使用dup
时,0 将是编号最低的未使用文件描述符,因此重复的 FD 将结束。既然你把你扔掉的东西放回去,scanf
很乐意在这样做后再次工作。