У нас есть код как часть более крупного приложения, в котором мы пытаемся 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, которое могло бы повлиять на это?