我在文件描述符方面遇到了一些问题。对于每个进程,符合POSIX的系统上的标准fd表应该将stdin设为0,将stdout设为1,将stderr设为2。此后,文件描述符应按顺序发出,因此打开()新文件的请求应返回文件描述符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!: %sn",strerror(errno));
exit(EXIT_FAILURE);
}
write(fToWrite,"kekeke",6);
fprintf(stderr,"fToWrite = %in",fToWrite);
close(fToWrite);
}
在我的机器上,运行完这段代码后,创建了kicks.txt,但没有任何内容写入其中
kekekefToWrite = 0
请注意,kekeke并没有被写入到kicks.txt,而我打开()的文件的文件描述符fToWrite是0。但是0是为stdin保留的。同样,如果我尝试将fprintf打印到STDOUT_FILENO(即int 1)或STDERR_FILENO(即2),我会得到一个segfault。在我尝试编写的主程序中,当我尝试将()写入STDOUT_FILENO时,程序会出错。几个小时前,同样的代码片段会很高兴地把字母放在控制台上;我不知道发生了什么变化。我已经重新启动了,但我不知道还能怎么办。
奇怪的是,printf仍然有效。我的印象是printf只是向fd表的#2条目中的任何内容写入。
您需要一对额外的括号:
if ((fToWrite = open(outFileName,O_WRONLY|O_CREAT|O_TRUNC)) < 0) {
这就是fToWrite获取值0的原因。
<
的优先级高于=
,因此将open(outFileName,O_WRONLY|O_CREAT|O_TRUNC) < 0
的结果分配给fToWrite
,即0
或1
。
所以你最终会写信给你的终端。