关闭标准输入后第二次扫描如何工作

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 很乐意在这样做后再次工作。