У меня проблемы с дескрипторами файлов.Стандартная таблица 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.