默认文件描述符表无法正常工作

时间:2012-02-18 08:23:17

标签: c file unix stdout file-descriptor

我在使用文件描述符方面遇到了一些麻烦。对于每个进程,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!: %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.但是为stdin保留了0。同样,如果我尝试fprintf到STDOUT_FILENO(这是int 1)或STDERR_FILENO(这是2),我得到一个段错误。在我尝试编写的主程序中,当我尝试将write()写入STDOUT_FILENO时,程序会出现段错误。几个小时前,相同的代码片段很乐意在控制台上添加字母;我不知道改变了什么。我重新启动了,但我不知道该怎么办。

奇怪的是,printf仍然有效。我的印象是printf只是写了fd表#2条目中的内容。

2 个答案:

答案 0 :(得分:2)

您需要额外的一对括号:

if ((fToWrite = open(outFileName,O_WRONLY|O_CREAT|O_TRUNC)) < 0) {

这就是 fToWrite 获得值0的原因。

答案 1 :(得分:0)

<的优先级高于=,因此您要将open(outFileName,O_WRONLY|O_CREAT|O_TRUNC) < 0的结果分配给fToWrite01 }。

所以你最终写信给你的终端。