Выдача системных команд в Linux из C, C ++ - PullRequest
3 голосов
/ 07 января 2011

Я знаю, что в приложении DOS / Windows вы можете выдавать системные команды из кода, используя такие строки, как:

system("pause");

или

system("myProgram.exe");

... из stdlib.h. Существует ли подобная команда Linux, и если да, в каком заголовочном файле я найду ее?

Кроме того, это считается плохой практикой программирования? Я пытаюсь получить список загруженных модулей ядра с помощью команды lsmod. Это хорошая идея или плохая идея? Я обнаружил, что некоторые веб-сайты, похоже, просматривали системные вызовы (по крайней мере, системные («пауза»);) в негативном свете.

Ответы [ 4 ]

13 голосов
/ 07 января 2011

system плохая идея по нескольким причинам:

  • Ваша программа приостановлена ​​до завершения команды.
  • Он запускает команду через оболочку, что означает, что вам нужно заботиться о том, чтобы передаваемая строка была безопасной для оболочки.
  • Если вы попытаетесь запустить фоновую команду с &, она окажется процессом внука и станет осиротевшей и захваченной процессом init (pid 1), и вы не сможете проверить ее статус после что.
  • Нет способа прочитать вывод команды обратно в вашу программу.

Для первой и последней проблемы popen - это одно решение, но оно не решает другие проблемы. Вы действительно должны использовать fork и exec (или posix_spawn) самостоятельно для запуска любой внешней команды / программы.

10 голосов
/ 07 января 2011

Не удивительно, что команда по-прежнему

system("whatever");

, а заголовок по-прежнему stdlib.h.Название этого заголовочного файла означает «стандартная библиотека», что означает, что на каждой стандартной платформе поддерживается C.

И да, вызов system() часто является плохой идеей.Обычно существуют более программные способы выполнения действий.

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

Быстрый поиск в Google обнаружит эту ссылку , которая указывает, что lsmod читает содержимое /proc/modules.

3 голосов
/ 07 января 2011

Ну, lsmod делает это, анализируя файл /proc/modules. Это был бы мой предпочтительный метод.

0 голосов
/ 07 января 2011

Я думаю, вы ищете форк и exec.

...