作为较大应用程序的一部分,我们有一个代码,我们尝试在其中 fopen() / dev / null 并返回文件指针。该代码用于更早地返回非标准文件描述符(可能在AIX 6.1或更低版本中)。 看来,在迁移/升级到AIX 7.1之后,以上代码返回了一个标准文件描述符。
我想知道AIX 7.1版本是否发生任何根本变化,可能会影响fopen()系统调用?
我相信没有对应用程序进行源代码更改,不会导致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,它们只是缓存相应的文件指针,然后在返回另一个文件指针(fd大于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。
所以,问题是,为什么GetDevNull()中的fopen()返回1?在我们迁移到AIX 7.1之后,这似乎正在发生。因此,我想知道AIX 7.1是否有任何重大更新会影响到这一点?
答案 0 :(得分:4)
我尝试了一个简单的示例代码(在我的应用程序之外), 在/ dev / null上打开吗?这似乎总是返回fd为3。但在 我的应用程序返回1。所以,我不知道在哪里 问题是。
如果fopen("/any/path", "any mode")
成功并且关联文件的文件号为1,则必须是该程序先前关闭了文件号1的情况,可能是通过关闭其stdout
流,或者它已经开始启动了。关闭它。标准流的文件号并不是天生的特殊。如果打开文件时其中一个可用,则该文件将获得该文件的文件描述符编号,因为系统使用了最低的文件描述符编号。这是预期的行为。