Почему fopen ("/ dev / null", "w") возвращает стандартный файловый дескриптор в AIX? - PullRequest
0 голосов
/ 15 июня 2019

У нас есть код как часть более крупного приложения, в котором мы пытаемся fopen () a / dev / null и вернуть указатель файла.Этот код используется для возврата нестандартного дескриптора файла ранее (возможно, с AIX 6.1 или более поздней версией).Похоже, что после миграции / обновления до AIX 7.1 приведенный выше код возвращает стандартный файловый дескриптор.

Мне было интересно, есть ли какие-либо фундаментальные изменения, произошедшие с версией AIX 7.1, которые потенциально могут повлиять на систему fopen ()call?

Я полагаю, что в приложении не было никаких изменений исходного кода, которые могли бы привести к вышеуказанному изменению в выводе fopen ().

Я попытался с простым примером кода (за пределами моегоприложение), которое работает на / dev / null;это, кажется, возвращает FD 3 всегда.Но в моем приложении возвращается 1. Итак, я не могу понять, где проблема.

FILE *fp = fopen("/dev/null", "w");
fprintf(stdout, "fd = %d\n", fileno(fp)); // --> this prints 1 in my application, but print 3 in a sample code.

Извините за путаницу.Ниже приведена актуальная функция:

FILE* GetDevNull()
{
    FILE* filesToClose[3];
    int count = 0;

    FILE* fp = fopen("/dev/null", "a");

    while(fp && fileno(fp) <= 3)
    {
        filesToClose[count++]=fp;
        fp = fopen("/dev/null", "a"); // this returns fileno(fp)=1 (STDOUT)
    }

    while(count)
        fclose(filesToClose[--count]); // STDOUT is closed here

        return fp;
}

Как я понимаю, в случае, если fopen возвращает 0, 1 или 2, они просто кэшируют соответствующие файловые указатели и затем закрываются перед возвратом другого файлового указателя (который имеети более чем 2).

Фон выглядит так:

FILE* fplog = fopen("my.log", "w");
dup2(fileno(fplog), STDOUT_FILENO); // happening else where in the application

После того, как вышеперечисленное, вызывается следующее.

FILE* fpnull = GetDevNull();

После вышеуказанного вызоваGetDevNull (), теперь STDOUT указывает не на my.log, а на /dev/null.

Итак, вопрос в том, почему fopen () в GetDevNull () возвращает 1?Это происходит после того, как мы перешли на AIX 7.1.Итак, мне было интересно, было ли какое-либо серьезное обновление AIX 7.1, которое могло бы повлиять на это?

1 Ответ

4 голосов
/ 15 июня 2019

Я попытался с простым примером кода (за пределами моего приложения), который fopen на / dev / null; это, кажется, возвращает FD 3 всегда. Но в мое приложение возвращает 1. Итак, я не могу понять, где проблема в том.

Если fopen("/any/path", "any mode") завершается успешно, и связанный файл имеет файл № 1, то это должно быть в том случае, если программа ранее закрыла файл № 1, возможно, закрыв свой поток stdout, или она запустилась с закрытым. Номера файлов для стандартных потоков по своей сути не являются специальными. Если один из них доступен при открытии файла, то файл получит этот номер для своего дескриптора файла, поскольку система использует наименьший доступный номер дескриптора файла. Это предполагаемое поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...