【问题标题】:Globally static int in self calling module自调用模块中的全局静态 int
【发布时间】:2016-02-04 22:41:21
【问题描述】:

(声明:这是作业)

我正在创建一个shell 程序,我们称之为fancysh。我正在尝试将 PATH(和其他环境变量)功能添加到我的 shell 中,到目前为止一切都很好。我天真的方法是将所有这些变量作为静态变量存储在 fancysh.c 中。但是,现在我正在尝试实现环境变量 SHLVL ,它保存了当前 shell 的“深度”。例如,我可以在 fancysh 的第一个实例中运行,并且 SHLVL 应该读取 1,在再次调用 fancysh 时,SHVLL 应该增加(并在退出 shell 时减少)。

我尝试过的...

fancysh.h

#ifndef FANCYSH_H
#define FANCYSH_H

extern int SHLVL;

#endif

fancysh.c

#include "fancysh.h"

int SHLVL;

int main(){

 /* some fancy code to determine if SHLVL is initalized */
 /* if not init to 0 */

 SHLVL ++;
 printf("%d\n", SHLVL);

 /* Test Code Only */
 int pid = fork();
 if(pid == 0 && SHLVL < 10)
   exec("fancysh");
 wait();
 /* Test Code Only */

 /*  shell code */
 SHLVL--;
 printf("%d\n", SHLVL);
 exit(0);
}

我使用答案 herehere 作为此解决方案的一部分。

那么我将如何实现花哨的代码来确定 SHLVL 是否已初始化?我对使用 #ifdef#define 的组合有一些想法,但我不是 100% 确定如何做到这一点。

【问题讨论】:

  • 注意:混淆通常是一个非常糟糕的主意。在这里你混淆了关键字extern。你为什么这样做?在可预见的未来极不可能发生变化。
  • 这样做是为了让 SHLVL 只在外部声明一次。
  • 同一变量的多个extern声明本质上没有问题,无论是在同一个翻译单元中,还是在为同一程序或库做出贡献的不同翻译单元中。
  • 啊,我明白了。这是无稽之谈,非常罕见。第一个没关系,第二个对整个标题使用标准后卫。这不是发挥创意的地方。
  • 我已经更新了问题。

标签: c shell xv6


【解决方案1】:

您需要了解不同的 shell 进程是不同的进程这一事实。仅仅因为一个 shell 实例是在另一个 shell 实例的范围内启动的,并不意味着前者会自动继承后者的任何数据。

或者不直接,反正。您的 shell 的任何新实例都将从启动它的进程接收环境。如果该环境包含 SHLVL 变量,那么新的 shell 进程当然可以读取该值,并且它可能会在其自己的范围内呈现该环境变量的不同值。

【讨论】:

  • 那么您的意思是,与其尝试在我的 shell 进程中同步变量,不如考虑将环境变量作为命令行参数传递给每个 shell 进程?
  • @CallbackKid,没有人提到命令行参数。我说过你的 shell 实例可以依赖其父进程提供给它的 environment。在任何情况下,它都不能在实例之间共享​​> SHLVL 的存储空间,因为不同的实例可以并且将需要维护不同的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-12
  • 1970-01-01
  • 1970-01-01
  • 2018-10-22
  • 2011-01-17
  • 1970-01-01
相关资源
最近更新 更多