繁体   English   中英

自调用模块中的全局静态int

[英]Globally static int in self calling module

(免责声明:这是家庭作业)

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

我尝试过的...

fancysh.h

#ifndef FANCYSH_H
#define FANCYSH_H

extern int SHLVL;

#endif

幻想曲

#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);
}

我在这里这里使用答案作为解决方案的一部分。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM