【发布时间】:2025-12-01 00:15:01
【问题描述】:
我在使用文件描述符时遇到了一些问题。 POSIX 兼容系统上的标准 fd 表应该,对于每个进程,stdin 为 0,stdout 为 1,stderr 为 2。此后,文件描述符应该按顺序发出,因此对 open() 新文件的请求应该返回文件描述符 3.
这不会发生在我的系统上。几个小时前工作的代码已经停止这样做。因为它的代码很长而且很乱,所以我写了一个我所看到的东西的快速示例。
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
void main(int argc, char *argv[])
{
int fToWrite;
char *outFileName = "chuckles.txt";
if (fToWrite = open(outFileName,O_WRONLY|O_CREAT|O_TRUNC) < 0) {
fprintf(stderr,"error during open!: %s\n",strerror(errno));
exit(EXIT_FAILURE);
}
write(fToWrite,"kekeke",6);
fprintf(stderr,"fToWrite = %i\n",fToWrite);
close(fToWrite);
}
在我的机器上,运行此代码后,创建了chuckles.txt,但没有写入任何内容。到控制台打印:
kekekefToWrite = 0
请注意,kekeke 没有写入chuckles.txt,并且我打开()ed 的文件的文件描述符fToWrite 为0。但0 是为stdin 保留的。同样,如果我尝试将 fprintf 打印到 STDOUT_FILENO(即 int 1)或 STDERR_FILENO(即 2),则会出现段错误。在我尝试编写的主程序中,当我尝试将()写入 STDOUT_FILENO 时,程序会出现段错误。几个小时前,同样的代码 sn-ps 会愉快地在控制台上放字母;我不知道发生了什么变化。我已经重启了,但我不知道还能做什么。
奇怪的是,printf 仍然有效。我的印象是 printf 只是写入了 fd 表的 #2 条目中的任何内容。
【问题讨论】:
-
更一般地说,文件描述符表对 Unix 来说是如此重要,以至于你应该相信它工作正常(否则你的内核完全没用)。不要相信“文件描述符表不工作”(因为它总是工作)而是“我做错了什么”!!!
标签: c file unix stdout file-descriptor