为什么fopen(“ / dev / null”,“ w”)在AIX上返回标准文件描述符?

时间:2019-06-15 03:56:41

标签: c fopen aix

作为较大应用程序的一部分,我们有一个代码,我们尝试在其中 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是否有任何重大更新会影响到这一点?

1 个答案:

答案 0 :(得分:4)

  

我尝试了一个简单的示例代码(在我的应用程序之外),   在/ dev / null上打开吗?这似乎总是返回fd为3。但在   我的应用程序返回1。所以,我不知道在哪里   问题是。

如果fopen("/any/path", "any mode")成功并且关联文件的文件号为1,则必须是该程序先前关闭了文件号1的情况,可能是通过关闭其stdout流,或者它已经开始启动了。关闭它。标准流的文件号并不是天生的特殊。如果打开文件时其中一个可用,则该文件将获得该文件的文件描述符编号,因为系统使用了最低的文件描述符编号。这是预期的行为。