为什么“LANG=C”不影响“分段错误”消息?

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

这是一个小的测试 C 程序,它只是故意崩溃:

#include <stdio.h>
#include <stdlib.h>
int main(void) {
    char *l = getenv("LANG");
    printf("LANG = %s\n", l);
    int *ptr = (int*)0x12345;
    *ptr = 12345;
    return 0;
}

“输出”:

$ ./a.out 
LANG = ru_RU.UTF-8
Ошибка сегментирования

崩溃的信息是俄语,符合LANG环境变量值,ok。现在,我想查看有关崩溃的英文消息(“分段错误”), 但使用显式“LANG=C”运行程序不起作用:

$ LANG=C ./a.out 
LANG = C
Ошибка сегментирования

为什么消息仍然是翻译的?

我的系统:Linux Mint 21.3(弗吉尼亚),gcc 11.4.0。

$ locale -a
C
C.utf8
... 
linux internationalization libc
1个回答
0
投票

当您将变量赋值放在命令开头时,环境变量仅导出到执行该命令的子进程,而不是当前 shell 进程的环境中。

当进程因信号而崩溃时,信号的描述由shell进程写入。所以它使用的是你原来的

LANG
环境,而不是子进程的环境。

要在

LANG=C
中获取错误消息,您需要从子 shell 运行该程序:

LANG=C bash -c './a.out'
© www.soinside.com 2019 - 2024. All rights reserved.