【问题标题】:Mysterious getenv() seg faults神秘的 getenv() 段错误
【发布时间】:2015-09-03 04:36:16
【问题描述】:

我正在尝试导出变量并使用getenv() 将其读回,但由于某种原因,它给了我一个分段错误..

#include<stdio.h>
#include<stdlib.h>

int main(){
    system("export LINES=$(stty size | awk '{print $1}');"
        "export COLUMNS=$(stty size | awk '{print $2}')");
    printf("%s %s\n", getenv("LINES"), getenv("COLUMNS"));
    return 0;
}

我正在运行 Ubuntu 14.04。

奇怪的是它在gdb上正常运行,编译时编译器输出显示没有错误,即使是-Wall -Wextra...
为什么会这样?

【问题讨论】:

    标签: c getenv


    【解决方案1】:

    system()运行的子进程不影响调用system()的进程的环境。

    所以system()执行的shell并没有在调用进程的环境中设置LINESCOLUMNS,所以getenv()很可能是返回了一对空指针,不知何故让人悲痛……除了 printf() 经常正常工作,即使将空指针传递给它以使用 %s 进行格式化(它为我生成了 (null),但这不是 C 标准规定的行为)。

    如果你想设置一个环境变量,你应该使用setenv()。您可能会遇到使用的旧代码 putenv() 代替,但你不应该在新代码中使用它。

    【讨论】:

    • 那你能解释一下为什么这在 gdb 上运行时有效吗?
    • @hoholee12,gdb 可能使用 ncurses 库并将 LINESCOLUMNS 变量导出到它产生的子进程。然后你从getenv(3) 得到非空值并且从printf(3) 没有错误结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 2017-04-20
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多