【问题标题】:Environment Variables in CC 中的环境变量
【发布时间】:2012-09-24 01:13:27
【问题描述】:

我知道这种类型的问题被问了很多,但似乎没有一个答案有帮助。我在 Ubuntu Linux 中通过 setenv() 函数调用设置了一个环境变量。但是,该程序似乎没有使用此环境变量。如果我使用getenv(),它会得到正确的值,但程序的输出是错误的。但是,当我在 shell 中使用 export BLOCKSIZE=512 时,程序的输出是正确的。我没有从程序中产生不同的进程。下面只是我正在做的一个代码sn-p,它不是我的整个程序。

这有什么原因吗?

【问题讨论】:

  • 你确定你的flags[9]等于1吗?您的代码在 ideone (link) 上产生了预期的结果。
  • @tpar44 在这种情况下setenv() 的返回值是多少?我也可能建议一起删除条件,因为它只会使问题变得模糊。
  • 谈论“预期结果”是没有帮助的,因为预期往往是不正确的。您需要清楚地说明您的期望和得到的。
  • '出于安全原因,这是设计使然。' ——不,尽管这可能是设计的偶然结果。更改子进程的环境变量会更改父进程的环境变量的实现会相当复杂——可能涉及分配给进程组的环境存储(在发明环境变量时不存在)——和用处不大。

标签: c environment-variables setenv getenv


【解决方案1】:

这里的问题是 Ubuntu Linux 的默认 BLOCKSIZE1024 而不是 512。因此,在计算stat 结构中的块时,即st_blocks 字段,我收到了与普通ls 不同的答案,因为在stat 中,块仅以512 字节块计算。这意味着我的程序不必考虑环境变量的大小。这里的主要问题是假设 Linux 使用 512 字节的块大小,正如我在教科书中所说的那样。

【讨论】:

    【解决方案2】:

    显示的代码中没有任何内容会受到 BLOCKSIZE 环境变量的影响。

    没有系统调用受 BLOCKSIZE 影响。我看不到您在哪里使用 512。诸如ls 之类的程序使用相同的系统调用从 o/s 获取数据,然后根据环境变量的设置调整它们呈现给您的值。但关键是,这是由ls在用户代码中决定的,而不是由内核在内核代码中决定的。

    由于您的代码没有调用ls 或任何其他程序,因此不会受到环境变量的影响。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-30
      • 2016-11-13
      • 2012-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-12
      相关资源
      最近更新 更多