关闭标准输入后第二次扫描如何工作
How is second scanf working after closing standard input
第二个 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;
}
我们正在关闭stdin(fd:0),那么dup(3)如何起到重新打开stdin的作用呢?
我想当你检查这两个dup调用的return值时,你会发现第一个是3,第二个是0。所以在调用第二个scanf函数之前,文件描述符0又和终端有关了
dup
的文档说它使用 "the lowest-numbered unused file descriptor for the new descriptor." 由于您刚刚关闭了 FD 0,下次您使用 dup
时,0 将是编号最小的未使用文件描述符,所以这就是重复的 FD 结束的地方。由于您完全放回了您扔掉的东西,scanf
很乐意在这样做后再次工作。
第二个 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;
}
我们正在关闭stdin(fd:0),那么dup(3)如何起到重新打开stdin的作用呢?
我想当你检查这两个dup调用的return值时,你会发现第一个是3,第二个是0。所以在调用第二个scanf函数之前,文件描述符0又和终端有关了
dup
的文档说它使用 "the lowest-numbered unused file descriptor for the new descriptor." 由于您刚刚关闭了 FD 0,下次您使用 dup
时,0 将是编号最小的未使用文件描述符,所以这就是重复的 FD 结束的地方。由于您完全放回了您扔掉的东西,scanf
很乐意在这样做后再次工作。