Есть ли в Linux команда, которая не выполняет системный вызов? [закрыто]

Я читал о системных вызовах и у меня возникло сомнение в том, что какая-либо команда выполняется без выполнения хотя бы одного системного вызова. Если нет, то какая команда с минимальным количеством системных вызовов? Я использовал strace для некоторых команд, но он дает длинный список. Может ли кто-нибудь сказать мне такую ​​команду?

3
задан 22 August 2015 в 20:04

5 ответов

/bin/true и /bin/false должны быть предустановленными командами с наименьшим количеством системных вызовов.

Вы можете сохранить некоторые системные вызовы путем статического связывания:

Сохраните следующее, например, как. minimal.c

int main() {
    return 0;
}

и скомпилируйте его, используя

gcc --static -o minimal minimal.c

. В результате вы получите программу minimal в текущей рабочей папке.

9
ответ дан 1 December 2019 в 12:56

Разговор о том, какие syscalls на самом деле выполняются для "работания" ("выполненный" поэтому интерпретируемый в принятом значении слова шире, чем принятое значение слова Вы, вероятно, обращаетесь к), программа, нет: для одного execve() syscall всегда выполняется только для выполнения команды (в этом случае, я думаю, что мы - более обеспеченный разговор об исполняемом файле), самом, и exit(), syscall всегда выполняется на main() возврат:

компилятор C заказывает телефонный разговор с выходом () после основной () возвраты

( Источник )

, Чтобы так или иначе рассмотреть Ваш вопрос, который исполняемо-зависим и следовательно очень широко: как подтверждение концепции, чтобы указать, что, вероятно, любой на самом деле полезный исполняемый файл использует по крайней мере один syscall, стоит указать, что, со своей стороны, exit() syscall, очень вероятно, будет выполнен из самой программы в случае ошибок; не говоря уже о том, что любое исполнимое открытие / закрытие дескриптора файла использует open() / close() syscalls.

В конце в любой команде, на самом деле полезной очень вероятно будет по крайней мере один syscall (например, такой как exit(), если программа столкнется с ошибкой во время выполнения и / или open() / close(), если команда должна считать файл вообще).

6
ответ дан 1 December 2019 в 12:56

Да. Существует несколько команд, которые работают, не делая системных вызовов.

Одна предпосылка таких команд - то, что они встроены в оболочку (bash для моей системы). Это устраняет и установку наверху (много системных вызовов, выполненных компоновщиком и libc для установки среды для кода для выполнения) и возможный выход () вызов.

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

bash команда help перечисляет все доступные внутренние команды. Обратите внимание, что многие из них делают системные вызовы, также. Некоторые, что не делают системные вызовы использования:

  • function
  • for
  • declare
  • true (встроенная версия; не /bin/true)
  • false (встроенная версия; не /bin/false)
  • shift
  • set
  • case
  • alias / unalias
  • set / unset

В общем..., если команда является внутренней к оболочке, не читает входа, не пишет никакой вывод и только не работает с переменными в памяти, это, вероятно, не использует syscall.

1
ответ дан 1 December 2019 в 12:56

Нет много программы, может значительно обойтись без создания любых системных вызовов вообще. Системные вызовы являются основным методом, через который программа общается с чем-либо вне самой программы.

Передача через файлы с отображенной памятью или общую память возможна, но она все еще требует, чтобы системные вызовы настроили это во-первых. Впоследствии это может использоваться для передачи без дальнейших системных вызовов.

программа А может получить информацию от внешней стороны до сигналов. Но если бы никакой обработчик сигналов не установлен, сигнал просто закрыл бы программу, и установка обработчика сигналов во-первых требует системного вызова. В принципе программа также должна сделать системный вызов в конце обработки полученного сигнала, но если бы сигнал был установлен до не блоки-сигналы в получении, то отъезд обработчика сигналов мог быть сделан без системного вызова. Это - больше любопытства, чем значимая техника с реальными применениями.

программа А, которая не делает системных вызовов, будет использовать все процессорное время, которое это может получить, потому что сон (в большинстве случаев) требует системного вызова. Программа может спать, потому что она ожидает отображенных страниц, которые будут загружены из диска. Но без системных вызовов единственные отображенные страницы, которые будут загружены, были бы самим исполняемым файлом, который будет скоро кэшироваться.

При запущении программы может сделать частичные результаты видимыми к другим программам путем изменения ее собственной командной строки или переменных среды. Они могут быть изменены без системного вызова.

Даже нормальное завершение программы включает системный вызов. Но программа может инициировать сигнал завершиться без системного вызова. Сигналы, которые могли возможно быть инициированы, включают SIGILL, SIGBUS, SIGFPE, SIGSEGV.

, Учитывая все это было бы возможно записать программу, которая при запуске сделает некоторые вычисления на значениях, обеспеченных на командной строке, и в конечном счете завершится через другой сигнал в зависимости от результата того вычисления. Это не самый полезный способ указать на результат вычисления, но это, конечно, возможно.

0
ответ дан 1 December 2019 в 12:56

Системные вызовы являются единственным способом, которым программа может общаться с внешним миром, включая объявление, что это работало к завершению.

, Таким образом, программа, которая не использует системных вызовов, не имеет никакого заметного эффекта, и не может завершить или оставить ЦП и таким образом должна выполнить навсегда использующую полную мощность ЦП. Не очень полезный.

1
ответ дан 1 December 2019 в 12:56

Другие вопросы по тегам:

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