(Отказ от ответственности: это домашнее задание)
Я создаю программу-оболочку, назовем ее fancysh. Я пытаюсь добавить функциональность PATH (и других env vars) в свою оболочку, пока все хорошо. Мой наивный подход состоял в том, чтобы хранить все эти переменные как статические переменные в файле fancysh.c. Однако теперь я пытаюсь реализовать переменную среды SHLVL, которая содержит текущую «глубину» оболочки. Например, я могу работать в первом экземпляре fancysh, и SHLVL должен читать 1, при повторном вызове fancysh SHLVL должен увеличиваться (и уменьшаться при выходе из оболочки).
Что я пробовал...
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);
}
Я использовал ответы здесь и здесь как часть этого решения.
Итак, как мне реализовать причудливый код, чтобы определить, инициализирован ли SHLVL? У меня были некоторые идеи об использовании комбинации #ifdef
и #define
, но я не уверен на 100%, как это сделать.
extern
. Зачем ты это делаешь? Крайне маловероятно, что она изменится в обозримом будущем. - person too honest for this site   schedule 05.02.2016extern
одной и той же переменной по своей сути не являются проблематичными ни в одной единице перевода, ни в разных единицах, вносящих вклад в одну и ту же программу или библиотеку. - person John Bollinger   schedule 05.02.2016