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

标签 c unix stdout stdin read-write

我正在做一个作业,其中程序将文件描述符作为参数(通常来自 exec 调用中的父级)并从文件中读取并写入文件描述符,在我的测试中,我意识到如果我使用 0、1 或 2 作为文件描述符,程序将在命令行运行并且不会给出错误。这对我来说很有意义,除了我可以写入 stdin 并让它显示在屏幕上。

这有解释吗?我一直认为 stdin/stdout 有一些保护,你当然不能 fprintf 到 stdin 或 fgets 从 stdout。

#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;
}

最佳答案

尝试在标记为只读的文件上写入或反之亦然会导致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);
  }

因此,stdin、out 和 err 都是同一个文件描述符的副本,以读写方式打开。

关于c - 写入 stdin 并从 stdout 读取(UNIX/LINUX/C 编程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34645942/

相关文章:

c - 指针指向指针的问题

linux - 通过 Bash Shell 脚本从 url 列表中提取父域名

c++ - Delphi - 从静态链接的 MSVC++ 编译的 DLL 捕获 stdout 和 stderr 输出

linux - 计算 Linux 中两个模式之间的模式总数(如果可能,使用 sed)

php - 使用 unix 时间戳作为订单 ID 有什么缺点?

python - 为什么向 subprocess.Popen 提供标准输入会导致写入标准输出的内容发生变化?

r - 如何使用 R CMD BATCH 抑制行号输出?

c - 需要帮助理解 char 和 int 指针

c - 寄存器值从 0x20000000 到 0x20000FFC

c - sscanf() 如何查看字符串中的数字?