为什么不在 stderr 上打印浮点错误消息?

Why floating point error message is not printing on stderr?

我正在运行使用java 应用程序使用java.lang.ProcessBuilder 宁c 语言代码。如果此 c 语言代码产生任何输出和错误,我可以通过 process.getInputStream()process.getErrorStream() 读取它们。但在某些情况下(当退出代码 = 136 或 139 时),例如代码执行因 floating point error 而失败,我在进程的错误流中没有收到任何错误。 所以,我尝试 运行 我的 c 语言代码直接在 shell 上,并将 stderr 和 stdout 重定向到单独的文件。 Code.c

#include<stdio.h>

int main() {
    int x = 1/0;
    return 0;
}

命令我是运行ning:

# gcc Code.c -o Code.out -std=c99
# ./Code.out 2>err.log 1>out.log
Floating point exception (core dumped)

如您所见,上面的错误仅在 shell 上打印,但未重定向到 err.log。此外,err.log 中什么也没有。我的问题是为什么这不是在 stderr 流中打印?根据我的理解,如果它不在 stderr 中打印,我将无法通过 process.getErrorStream 读取它。无论代码执行生成的错误消息是什么,我都想将其显示给最终用户。

正如dave_thompson_085评论的那样,Floating point exception (core dumped)消息来自Shell而不是程序。

这是一个测试程序:

#include<stdio.h>

int main() {
    fprintf(stdout, "normal output, %d\n", __LINE__);
    fprintf(stderr, "error output, %d\n", __LINE__);
    fflush(stdout);
    fflush(stderr);

    int x = 1/0;

    fprintf(stdout, "normal output, %d\n", __LINE__);
    fprintf(stderr, "error output, %d\n", __LINE__);
    fflush(stdout);
    fflush(stderr);

    return 0;
}
# gcc code.c -o Code -std=c99
# ./Code  2>err.log 1>out.log
normal output, 4
error output, 5
Floating point exception (core dumped)

# cat out.log
normal output, 4

$cat err.log
error output, 5

当float异常发生时,被OS捕获并强制退出