Таблица дескрипторов файла по умолчанию не работает должным образом
-
27-10-2019 - |
Вопрос
У меня есть некоторые проблемы с дескрипторами файлов. Стандартная таблица 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
.
Итак, вы в конечном итоге пишете на свой терминал.