神秘的getenv()seg错误

时间:2015-09-03 04:36:16

标签: c system heisenbug getenv

我正在尝试导出变量并使用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"));

    //Heisenbug?
    return 0;
}

我正在运行Ubuntu 14.04。

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

1 个答案:

答案 0 :(得分:5)

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

因此,system()执行的shell在调用进程的环境中不设置LINESCOLUMNS,因此getenv()可能返回一对空指针,它会以某种方式引起悲伤...除非printf()经常正常工作,即使将空指针传递给它以便用%s进行格式化(它为我生成(null),但是不是C标准规定的行为。)

请注意,我在shell脚本中忽略了非预期的语法(不是正式的错误) - 在第二个export之前缺少分号或换行符。

如果要设置环境变量,则应使用setenv()。您可能会遇到使用的旧代码 相反,putenv(),但您不应在新代码中使用它。