Является ли плохой практикой использование функции system (), когда вместо нее можно использовать библиотечные функции? Зачем? - PullRequest
6 голосов
/ 04 февраля 2009

Скажем, есть некоторая функциональность, необходимая для разрабатываемого приложения, которая может быть достигнута путем системного вызова либо программы командной строки, либо использования библиотеки. Предполагая, что эффективность не является проблемой, является ли плохой практикой простой системный вызов программы вместо использования библиотеки? Каковы недостатки этого?

Чтобы конкретизировать ситуацию, примером этого сценария может быть приложение, которому необходимо загрузить файл с веб-сервера, для этого можно использовать либо программу cURL, либо библиотеку libcURL.

Ответы [ 8 ]

10 голосов
/ 04 февраля 2009

Если вы не пишете код только для одной ОС, невозможно узнать, сработает ли ваш системный вызов. Что происходит при обновлении системы или обновлении ОС?
Никогда использовать системный вызов, если есть библиотека для выполнения той же функции.

3 голосов
/ 04 февраля 2009

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

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

Функция system () удобна, но опасна, не в последнюю очередь потому, что обычно она вызывает оболочку. Возможно, вам лучше вызывать программу более напрямую - в Unix, через системные вызовы fork () и exec (). [Обратите внимание, что системный вызов очень отличается от вызова функции system(), кстати!] OTOH, вам может потребоваться заботиться о том, чтобы все дескрипторы открытых файлов в вашей программе были закрыты - особенно если ваша программа работает на каком-то демоне, работающем от имени других пользователей; это не проблема, если вы не используете специальные привилегии, но все же будет хорошей идеей не предоставлять вызванной программе доступ ко всему, что вы не намеревались. Возможно, вам придется взглянуть на системный вызов fcntl() и флаг FD_CLOEXEC.

Как правило, легче контролировать вещи, если вы встраиваете функциональность в свою программу, но это не тривиальное решение.

3 голосов
/ 04 февраля 2009

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

2 голосов
/ 04 февраля 2009

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

1 голос
/ 04 февраля 2009

Да, как упоминалось выше, имейте в виду разницу между системными вызовами (например, вызовами fcntl () и open ()) и системными (). :)

На ранних этапах создания прототипа c-программы я часто выполняю внешние вызовы таких программ, как grep и sed, для манипулирования файлами с помощью popen (). Это не безопасно, это не безопасно, и это, конечно, не переносимо. Но это может позволить вам быстро начать работу. Это ценно для меня. Это позволяет мне сосредоточиться на действительно важном ядре программы, обычно по той причине, по которой я сначала использовал c.

На языках высокого уровня вам лучше иметь достаточно вескую причину. :)

1 голос
/ 04 февраля 2009

Системные вызовы намного сложнее сделать безопасно.

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

0 голосов
/ 18 мая 2011

Другие отметили хорошие моменты (надежность, безопасность, безопасность, мобильность и т. Д.) - но я выброшу другой. Спектакль. Как правило, во много раз быстрее вызывать библиотечную функцию или даже создавать новый поток, чем запускать весь новый процесс (и тогда вам все равно нужно правильно проверить / проверить его выполнение и проанализировать его вывод!)

0 голосов
/ 04 февраля 2009

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

...