Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 默认文件描述符表工作不正常_C_File_Unix_Stdout_File Descriptor - Fatal编程技术网

C 默认文件描述符表工作不正常

C 默认文件描述符表工作不正常,c,file,unix,stdout,file-descriptor,C,File,Unix,Stdout,File Descriptor,我在文件描述符方面遇到了一些问题。POSIX兼容系统上的标准fd表应针对每个进程将标准DIN设置为0,标准DOUT设置为1,标准DERR设置为2。此后,文件描述符应按顺序发出,因此打开新文件的请求应返回文件描述符3 这不会发生在我的系统上。几小时前还在运行的代码已经停止运行。因为它是非常长而且混乱的代码,我已经写了一个我所看到的这类事情的快速示例 #include <fcntl.h> #include <stdio.h> #include <unistd.h>

我在文件描述符方面遇到了一些问题。POSIX兼容系统上的标准fd表应针对每个进程将标准DIN设置为0,标准DOUT设置为1,标准DERR设置为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);
}
请注意,kekeke没有写入chuckles.txt,文件I open()ed的文件描述符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) {
if((fToWrite=open(outFileName,O_WRONLY | O|u CREAT | O|u TRUNC))<0){

这就是为什么fToWrite获取值0。

更一般地说,文件描述符表对于Unix非常重要,您应该相信它工作正常(否则您的内核就完全无用)。不要相信“文件描述符表不工作”(因为它总是工作),而应该相信“我做错了什么?”一开始
if ((fToWrite = open(outFileName,O_WRONLY|O_CREAT|O_TRUNC)) < 0) {