недостатки функции системы - PullRequest
0 голосов
/ 12 апреля 2011

Мы используем C в Linux.Есть ли вероятность, что функция system() может вести себя неожиданно, особенно когда мы обрабатываем сигналы?

Мы обнаружили, что иногда функция system() блокирует выполнение или выдает SIGSEGV.

Например:

system ( "/bin/mv a b" );

Есть ли какие-либо известные недостатки в использовании system(), которые могли бы объяснить это?

Ответы [ 2 ]

2 голосов
/ 12 апреля 2011

Функция system() делает то, что должна делать на отлично.Поведение довольно надежное, если оно вызывается правильно.Он имеет два режима работы:

  1. Проверьте, доступен ли интерпретатор команд - когда аргумент является нулевым указателем.
  2. Запустите данную команду, ожидая ее завершения.перед возвратом.

Итак, оператор system() блокируется до завершения оболочки, выполняющей команду.В Unix-подобных системах эффективно вызывается команда:

"sh", "-c", "...argument to system...", NULL

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

system("( /bin/mv a b & )");

Существует несколько обстоятельств, когда system() сама генерирует SIGSEGV.Вам нужно будет передать ему недопустимый указатель, указатель на недопустимый указатель в программе.

0 голосов
/ 12 апреля 2011

system() вызов должен блокировать до завершения выполнения.Если для перемещения a на b требуется час, процесс или поток, вызывающий system() , будет блокироваться в течение часа.Зная это, можно объяснить странное поведение.

Если вы ожидаете немедленного возврата system(), это, вероятно, означает, что вы ожидаете, что код, запускаемый после вызова, будет введен к тому времени, когда вы увидите странное поведение.Весьма вероятно, что из-за того, что system() занимает больше времени, чем ожидалось, некоторая область памяти не была выделена или инициализирована.Вероятно, это является причиной ошибки сегментации, когда другой поток или процесс пытался получить к ней доступ.

Другими словами, если вы не ожидали system() блокировки, вы, вероятно, предположилиэтот код, следующий за ним, будет запускаться гораздо раньше, чем на самом деле.

Разблокировка, которая станет темой для другого вопроса.Ответ на этот вопрос - нет, вы не видите недостатков в функции system(), она ведет себя точно так, как ожидалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...