Таблица дескрипторов файлов по умолчанию не работает должным образом - PullRequest
2 голосов
/ 18 февраля 2012

У меня проблемы с дескрипторами файлов.Стандартная таблица fd в POSIX-совместимой системе должна для каждого процесса иметь 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, файловый дескриптор файла, который я открываю () ed, равен 0. Но 0 зарезервировано дляSTDIN.Точно так же, если я пытаюсь выполнить fprintf в STDOUT_FILENO (который является int 1) или STDERR_FILENO (который равен 2), я получаю ошибку segfault.В основной программе, которую я пытаюсь написать, программа segfaults, когда я пытаюсь записать () в STDOUT_FILENO.Несколько часов назад те же самые фрагменты кода с радостью помещали буквы на консоли;Я не знаю, что изменилось.Я перезагрузился, но я не знаю, что еще с этим делать.

Странно, printf все еще работает.У меня сложилось впечатление, что printf только что записал то, что было в записи # 2 таблицы fd.

Ответы [ 2 ]

2 голосов
/ 18 февраля 2012

Вам нужна дополнительная пара скобок:

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

Именно поэтому fToWrite получает значение 0.

0 голосов
/ 18 февраля 2012

< имеет более высокий приоритет, чем =, поэтому вы присваиваете результат open(outFileName,O_WRONLY|O_CREAT|O_TRUNC) < 0 для fToWrite, то есть 0 или 1.

Итак, вы заканчиваете тем, что пишете на свой терминал.

...