为什么在注释fflush(stdout)时,“And write”首先出现? 因为C stdio缓冲区尚未填充,所以在缓冲区填充、stdio句柄刷新或程序结束之前,使用stdio API编写的任何内容实际上都不会发送到输出。您的直接write调用(例如"And write")完全绕过stdio缓冲区,并立即写入,所有缓冲的内容直到程序结束(或者至少在"And write"已经写入之后)才会出现。 为什么lseek打印-1? 第一个lseek是在fd上调用的,您在dup2覆盖STDOUT_FILENO/1后不久关闭了它,因此它失败了。如果您正确地检查了errno(在每个lseek之前将errno归零,分别调用两个lseek,分别存储或打印它们的错误和errno,这样其中一个在您看到它之前不会覆盖另一个的errno),您会看到它的值对应于EBADF,而不是ESPIPE。第二个lseek(STDOUT_FILENO)运行得很好。一个稍微修改过的代码版本(使用stderr,这样即使在无法读取实际文件的情况下也可以看到最后两个输出的输出,每次都仔细地归零errno,在再次调用lseek之前打印它,并使用strerror显示errno的友好描述)清楚地显示了这一点:在线尝试!