В коде ниже, я хотел бы значение THE_VERSION_STRING
быть взятым от значения переменной среды MY_VERSION
во время компиляции
namespace myPluginStrings {
const char* pluginVendor = "me";
const char* pluginRequires = THE_VERSION_STRING;
};
Так, чтобы, если я ввожу:
export MY_VERSION="2010.4"
pluginRequires
будет установлен в "2 010,4", даже если MY_VERSION
установлен на что-то еще во время выполнения.
ОБНОВЛЕНИЕ: (21 февраля) спасибо за Вашу справку все.Работает. Поскольку я использую Грабли в качестве системы сборки, каждый из моих CFLAGS является рубиновой переменной. Также значения должны закончиться в кавычках. Поэтому gcc командная строка для меня должна быть похожей на это:
gcc file.c -o file -D"PLUGIN_VERSION=\"6.5\""
Что означает, что это находится в моем Rakefile:
"-D\"PLUGIN_VERSION=\\\"#{ENV['MY_VERSION']}\\\"\""
Для ответа на последнюю часть вопроса - что делает ядро, если системному вызову необходимо перевести в спящий режим -
После системного вызова ядро по-прежнему логически выполняется в контексте той же задачи, что и системный вызов. - он находится только в режиме ядра, а не в пользовательском режиме - это НЕ отдельный поток, и большинство системных вызовов не вызывают логику из другой задачи/потока. Происходит то, что системный вызов вызывает wait_event, wait_event_timeout или какую-либо другую функцию ожидания, которая добавляет задачу в список задач, ожидающих чего-либо, затем переводит задачу в спящий режим, который изменяет ее состояние, и вызывает расписание () для освобождения текущего ЦП.
После этого задача не может быть запущена снова до тех пор, пока она не проснется, обычно другой задачей (задачей ядра и т.д.) или обработчиком прерываний, вызывающим функцию пробуждения *, которая пробуждает задачу (задачи), ожидающую этого конкретного события, что означает, что планировщик вскоре назначит их снова.
Стоит отметить, что задачи в области пользователя (т.е. потоки) - это только один тип задачи, и есть несколько других внутренних задач ядра, которые также могут работать - это потоки ядра и обработчики нижней половины/tasklets/очереди задач и т.д. Работа, которая не относится к какому-либо конкретному процессу пользовательского пространства (например, обработка сети, например, ответ на эхо-запросы), выполняется в этих процессах. Этим задачам разрешено переходить в спящий режим, в отличие от прерываний (которые не должны вызывать планировщик)
-121--1357741-Сделайте его работу медленной, во-первых, с чистым модульным кодом.
Если он модульный, можно заменить слой или два, не отказываясь от всего этого.
Хотя они обеспечивают модульность, будьте осторожны с веб-услугами, даже REST, поскольку они имеют тенденцию быть медленными; с каждым соединением, например, связано много накладных расходов.
-121--2953937- Если я правильно помню, можно использовать параметр командной строки -D
с gcc на # определить
значение во время компиляции.
т.е.:
$ gcc file.c -o file -D"THE_VERSION_STRING=${THE_VERSION_STRING}"
В приведенном ниже коде я хотел бы значение THE_VERSION_STRING должно быть взято из значения переменной окружения MY_VERSION во время компиляции
Нет, вы не можете сделать это так. Единственный способ извлечь переменные среды - во время выполнения с помощью функции getenv ()
. Вам нужно будет явно извлечь значение и скопировать его в pluginRequires
.
Если вам нужен эффект от константы времени компиляции, вам нужно указать определение в командной строке компилятора, как предлагает Сет .