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

标签 c file unix stdout file-descriptor

我在使用文件描述符时遇到了一些问题。对于每个进程,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/

相关文章:

Cython 相当于 c 定义 #define myfunc(node x,...) SetNode(x.getattributeNode(),__VA_ARGS__)

c++ - 编译标志 -static 对于 gcc 真正意味着什么

Bash - 一个脚本的两个进程

linux - Grep 并仅打印匹配的单词和下一个单词

C编程: Pointer to a row of a 2D array?

c - 使用 fscanf() 在 C 中以科学格式读取数字时出现问题

c++ - 防病毒软件如何能够以读取模式打开文件,即使它被共享拒绝读取和写入

c - 在c中读取unicode文件

java - 为什么 listFiles() 也将目录列为文件?

linux - 如何grep美元符号($)?