Глобально статический int в модуле самовызова

(Отказ от ответственности: это домашнее задание)

Я создаю программу-оболочку, назовем ее 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%, как это сделать.


person Callback Kid    schedule 04.02.2016    source источник
comment
Примечание: запутывание — вообще очень плохая идея. Здесь вы запутываете ключевое слово extern. Зачем ты это делаешь? Крайне маловероятно, что она изменится в обозримом будущем.   -  person too honest for this site    schedule 05.02.2016
comment
Это было сделано для того, чтобы SHLVL был внешне объявлен только один раз.   -  person Callback Kid    schedule 05.02.2016
comment
Множественные объявления extern одной и той же переменной по своей сути не являются проблематичными ни в одной единице перевода, ни в разных единицах, вносящих вклад в одну и ту же программу или библиотеку.   -  person John Bollinger    schedule 05.02.2016
comment
А, теперь я вижу. Это нонсенс и очень редко. 1-й не имеет значения, а 2-й использует стандартную защиту для всего заголовка. Это неподходящее место для творчества.   -  person too honest for this site    schedule 05.02.2016
comment
Я обновил вопрос.   -  person Callback Kid    schedule 05.02.2016
comment
@Olaf, я не пытался проявить творческий подход, я просто подумал, что этот ответ применим к моему вопросу.   -  person Callback Kid    schedule 05.02.2016
comment
Если бы я должен был предоставить ответ, я бы не публиковал комментарий. Комментарии предназначены не для предоставления ответа, а для добавления информации, относящейся к коду, или запроса разъяснений. Необычный код менее читаем, и мы можем легко что-то проконтролировать. Так устроен человеческий мозг (пожимает плечами:-).   -  person too honest for this site    schedule 05.02.2016


Ответы (1)


Вам нужно понять тот факт, что разные процессы оболочки — это разные процессы. Тот факт, что один экземпляр оболочки запускается в рамках другого экземпляра оболочки, не означает, что первый автоматически наследует любые данные от второго.

Во всяком случае, не напрямую. Любой новый экземпляр вашей оболочки получит среду от запускающего его процесса. Если эта среда содержит переменную SHLVL, то новый процесс оболочки, конечно, может прочитать это значение и, возможно, представить другое значение этой переменной среды в пределах своей области.

person John Bollinger    schedule 04.02.2016
comment
Итак, вы подразумеваете, что вместо того, чтобы пытаться синхронизировать переменные в моих процессах оболочки, я должен вместо этого изучить передачу env vars в качестве аргументов командной строки для каждого процесса оболочки? - person Callback Kid; 05.02.2016
comment
@CallbackKid, никто ничего не сказал об аргументах командной строки. Я сказал, что экземпляр вашей оболочки может полагаться на окружение, предоставленное ему его родительским процессом. Он ни в коем случае не может разделять хранилище для SHLVL между экземплярами, потому что разные экземпляры могут и должны поддерживать разные значения. - person John Bollinger; 05.02.2016