0

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

#include<stdio.h>

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

我正在运行的命令:

# 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 读取它。无论代码执行生成的错误消息是什么,我都想将其展示给最终用户。

4

1 回答 1

1

正如 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

当浮动异常发生时,被操作系统捕获并强制退出。

于 2022-02-11T12:34:37.320 回答