Функция System () с использованием Octave

Очевидно, невозможно без изменения исходного кода.

Поиск login.defs или LOGIN_TIMEOUT действительно не дает релевантных результатов, а при просмотре loginutils / login.c действительно кажется, что значение и все таймер жестко запрограммирован:

 enum {
TIMEOUT = 60, 
EMPTY_USERNAME_COUNT = 10, 
 / * Некоторые пользователи обнаружили, что ограничение в 32 символа слишком мало: * / 
USERNAME_SIZE = 64, 
TTYNAME_SIZE = 32, 
}; 
  

[…]

 static void alarm_handler (int sig UNUSED_PARAM) 
 {
 / * Это аварийный люк! Бедные пользователи последовательной линии и тому подобное 
 * прибывают сюда, когда их соединение обрывается. 
 * Мы не хотим блокировать здесь * / 
ndelay_on (STDOUT_FILENO); {{1 }} / * Проверка правильности восстановления attr: 
 * запустить "getty 0 -" из оболочки, ввести поддельное имя пользователя, остановиться на запросе пароля 
 *, подождать время ожидания. Без приведенного ниже tcsetattr 
 *, когда вы вернетесь к приглашению оболочки, эхо будет по-прежнему отключено. 
 * / 
tcsetattr_stdin_TCSANOW (& G.tty_attrs); 
printf ("\ r \ nLogin time out after% u seconds \ r \ n", TIMEOUT); 
fflush_all (); 
 / * unix API - это мозг поврежден в отношении O_NONBLOCK, 
 * мы должны отменить его, иначе мы можем повлиять на другие процессы * / 
ndelay_off (STDOUT_FILENO); 
 _exit (EXIT_SUCCESS); 
} 
  

[…]

 int login_main (int argc, char ** argv) MAIN_EXTERNALLY_VISIBLE; 
int login_main (int argc UNUSED_PARAM, char ** argv) 
 {
  

[…]

  / * Мы устанавливаем только обработчик тайм-аута _после_ сохранения G.tty_attrs * / 
signal (SIGALRM, alarm_handler); 
alarm (TIMEOUT); 
 

Обратите внимание, что последняя часть не с отступом кажется, что вокруг него нет if , поэтому он всегда выполняется. Возможно, вы могли бы раскомментировать последние две строки и заново скомпилировать busybox , если это возможно.

Альтернативная идея

Из примера inittab busybox :

# : Valid actions include: sysinit, respawn, askfirst, wait, once,
#                                  restart, ctrlaltdel, and shutdown.
#
#       Note: askfirst acts just like respawn, but before running the specified
#       process it displays the line "Please press Enter to activate this
#       console." and then waits for the user to press enter before starting
#       the specified process.

Таким образом, вы можете просто изменить respawn на askfirst . Таким образом, / bin / login по истечении тайм-аута просто вернется к приглашению Пожалуйста, нажмите Enter… вместо того, чтобы сразу снова запустить / bin / login .

1
07.05.2017, 00:14
2 ответа

Псевдонимы предназначены для интерактивных оболочек. Bash читает .bashrc только при запуске интерактивной оболочки. Не существует файла конфигурации¹, который делает псевдонимы доступными для функции system. Такая функция может быть опасной², потому что она повлияет на каждую команду оболочки, вызываемую приложением, и, возможно, заставит ее делать что-то неожиданное.

Чтобы сделать приложение доступным из любого места, убедитесь, что каталог, в котором находится исполняемый файл, находится в вашем пути поиска команд. Либо добавьте каталог к ​​вашему пути в сценарии входа в систему, например.

PATH="$PATH:/opt/ltspice/bin"

или поместите символическую ссылку на исполняемый файл в каталог, который уже находится на вашем пути, например.

ln -s /opt/ltspice/bin/ltspice /usr/local/bin/ltsipce

¹ На самом деле так и есть — все распространенные оболочки sh читают файл, обозначенный переменной среды ENV. Но я не рекомендую использовать это в любом случае.
² Да. Пользователей Csh время от времени кусает их .cshrc.Есть причина, по которой сценарии csh обычно начинаются с /bin/csh -f.

0
27.01.2020, 23:33

Псевдонимы доступны только в сеансе, в котором они определены (поскольку они предназначены для интерактивного использования), поэтому Octave их не увидит.

Вместо этого я бы рекомендовал указать полный путь к ltspice в вызове system().

2
27.01.2020, 23:33

Теги

Похожие вопросы