POSIX表示预期stderr将开放进行读取和写入是什么意思?

问题描述 投票:5回答:1

stderr, stdin, stdout - standard I/O streams上的POSIX页面说:

stderr流将被打开以进行读写。

“预期有多强?违反未定义行为吗?是谁的责任,是系统的责任还是应用程序的责任?

考虑此程序:

#include <stdio.h>

int main(void) {
    printf("feof is %d and ferror is %d\n", feof(stderr), ferror(stderr));
    printf("fgetc is %d\n", fgetc(stderr));
    printf("feof is %d and ferror is %d\n", feof(stderr), ferror(stderr));
}

[当我运行该程序而不重定向stderr(因此它就像stdin一样指向我的终端)时,它立即输出此代码而无需等待任何输入:

feof is 0 and ferror is 0
fgetc is -1
feof is 0 and ferror is 1

这是否意味着我的系统不符合POSIX?

此外,如果这是我的责任,那么假设我有一个权限为620的文件,并且属于该组,但没有所有者。这是否意味着someprogram 2>saidfile是未定义的行为,因为无论如何在这种情况下您都无法从stderr读取?

c file language-lawyer posix stderr
1个回答
0
投票

POSIX在specification for execve中对此进行了详细说明:

如果成功调用exec系列功能之一后,如果关闭文件描述符0、1或2,实现可能会在新过程映像中为文件描述符打开未指定的文件。如果在未打开文件描述符0进行读取或未打开文件描述符1或2的情况下执行标准实用程序或合格应用程序,则执行该实用程序或应用程序的环境应被视为不合格,因此实用程序或应用程序的行为可能不符合本标准中所述。

对于您自己的应用程序,如果他们尝试在关闭任何一个程序的情况下执行并可以设置自己的规则(包括认为违反合同,则应为实现打开新的stdin / out / err的可能性做好准备)如果标准文件描述符在启动时未打开,则如何处理它会导致灾难性的错误行为。

对于标准实用程序,上面的文本进行了介绍。

execve仅指定它们与那些文件描述符关联。我同意还不够清楚,但是合理的解释是,如果在应用程序入口处相应的文件描述符未打开或未针对相应模式打开,则结果是在相关功能下针对该条件指定的结果(通常为EBADF) 。例如,document you cited指定:

[EBADF]

[CX] [Option Start]底层流的文件描述符不是有效的文件描述符,无法读取。 [选项结束

关于“预期为”文本:

预计将打开stderr流以进行读写。

我认为标准中的任何地方都没有定义“预期为”。但是,此处使用单词[[stream,而不是文件/文件描述符,因此我会读到,由于fgetc流的FILE模式(如fopen模式中一样)使得两者均未读只要遵守关于它们之间切换的规则,就不会在其上编写函数产生未定义的行为。没有此文字,例如在没有POSIX的情况下,stderr可能会产生未定义的行为。

© www.soinside.com 2019 - 2024. All rights reserved.