我在使用文件描述符时遇到了一些问题。对于每个进程,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,并且我打开的文件的文件描述符fToWrite 为0。但0 是为stdin 保留的。同样,如果我尝试 fprintf 到 STDOUT_FILENO(即 int 1)或 STDERR_FILENO(即 2),我会遇到段错误。在我尝试编写的主程序中,当我尝试 write() 到 STDOUT_FILENO 时,程序出现段错误。几个小时前,相同的代码片段会很高兴地将字母显示在控制台上;我不知道发生了什么变化。我已经重新启动,但我不知道还能做什么。
奇怪的是,printf 仍然有效。我的印象是 printf 只是写入 fd 表的 #2 条目中的任何内容。
最佳答案
您需要一对额外的括号:
if ((fToWrite = open(outFileName,O_WRONLY|O_CREAT|O_TRUNC)) < 0) {
这就是为什么 fToWrite 的值为 0。
关于c - 默认文件描述符表无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9339748/