写入stdin并从stdout读取(UNIX/LINUX/C编程)

Tim*_*Tim 15 c unix stdin stdout read-write

我工作的分配,其中一个程序把文件描述符作为参数(一般在exec调用父),并从文件中读取和写入文件的描述符,并在我的测试中,我意识到,程序会工作从命令行开始,如果我使用0,1或2作为文件描述符,则不会出错.这对我来说很有意义,除了我可以写入stdin并让它显示在屏幕上.

对此有解释吗?我一直认为在stdin/stdout上有一些保护,你当然不能从stdout到stdin或fgetsf.

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
int main()
{
    char message[20];
    read(STDOUT_FILENO, message, 20);
    write(STDIN_FILENO, message, 20);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*ave 12

尝试在标记为readonly或反之亦然的文件上写入将导致writeread返回-1,并且失败.在这种特定情况下,stdin和stdout实际上是同一个文件.实质上,在程序执行之前(如果你不进行任何重定向),shell会:

  if(!fork()){
       <close all fd's>
       int fd = open("/dev/tty1", O_RDWR);
       dup(fd);
       dup(fd);
       execvp("name", argv);
  }
Run Code Online (Sandbox Code Playgroud)

因此,stdin,out和err都是相同文件描述符的副本,为读取和写入打开.

  • 更正一下,这不是由 shell 完成的,而是由终端(模拟器)完成的。shell 将像任何其他进程一样继承其 stdin/stdout 句柄。 (6认同)

Ave*_*y3R 2

最佳猜测 - stdin 指向输入的来源,即您的终端,而 stdout 指向输出应该去的地方,即您的终端。因为它们都指向同一个地方,所以它们可以互换(在本例中)?

  • 但它们可能不是您的终端。 (2认同)