我正在做一个作业,其中程序将文件描述符作为参数(通常来自 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;
}
最佳答案
尝试在标记为只读的文件上写入或反之亦然会导致write
和read
返回-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/