【发布时间】: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);
}
我使用答案 here 和 here 作为此解决方案的一部分。
那么我将如何实现花哨的代码来确定 SHLVL 是否已初始化?我对使用 #ifdef 和 #define 的组合有一些想法,但我不是 100% 确定如何做到这一点。
【问题讨论】:
-
注意:混淆通常是一个非常糟糕的主意。在这里你混淆了关键字
extern。你为什么这样做?在可预见的未来极不可能发生变化。 -
这样做是为了让 SHLVL 只在外部声明一次。
-
同一变量的多个
extern声明本质上没有问题,无论是在同一个翻译单元中,还是在为同一程序或库做出贡献的不同翻译单元中。 -
啊,我明白了。这是无稽之谈,非常罕见。第一个没关系,第二个对整个标题使用标准后卫。这不是发挥创意的地方。
-
我已经更新了问题。