Таблица дескрипторов файла по умолчанию не работает должным образом

StackOverflow https://stackoverflow.com/questions/9339748

Вопрос

У меня есть некоторые проблемы с дескрипторами файлов. Стандартная таблица FD в системе, соответствующей POSIX, должна для каждого процесса иметь Stdin как 0, stdout as 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);
}

На моей машине, после запуска этого кода, создается cuckles.txt, но для него ничего не записано. На консоли напечатана:

kekekefToWrite = 0

Обратите внимание, что Kekeke не был записан на Cuckles.txt, и что ftowrite, дескриптор файла файла i open () ed, равен 0., но 0 зарезервировано для Stdin. Аналогичным образом, если я попытаюсь FPRINTF в stdout_fileno (который является int 1) или stderr_fileno (который 2), я получаю сегфол. В основной программе, которую я пытаюсь написать, программа сетевится, когда я пытаюсь написать () в 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.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top