Одна из проблем с system()
заключается в том, что она подразумевает знание синтаксиса и языка оболочки для синтаксического анализа и выполнения вашей командной строки.Это создает возможность для ошибки, когда вы неправильно проверяли ввод, и оболочка может прерывать что-то вроде подстановки переменной или определения, где аргумент начинается или заканчивается так, как вы этого не ожидаете.Кроме того, оболочка другой ОС может иметь синтаксис, отличающийся от вашего, включая очень тонкое расхождение, которое вы сразу не заметите.По этим причинам я предпочитаю использовать execve()
вместо system()
- вы можете напрямую передавать argv
токены и не беспокоиться о чем-то посередине (неправильно) при анализе ввода.
Другая проблема с system()
(это также относится к использованию execve()
) состоит в том, что когда вы кодируете это, вы говорите: «найдите эту программу и передайте ей эти аргументы».Это делает пару предположений, которые могут привести к ошибкам.Во-первых, программа существует и может быть найдена в $PATH
.Может быть, в какой-то системе это не так.Во-вторых, возможно, в какой-то системе или даже в будущей версии вашей собственной ОС, она будет поддерживать другой набор опций.В этом смысле я бы избегал этого, если только вы не уверены, что система, на которой вы будете работать, будет иметь эту программу.(Например, вы, возможно, включили программу callee в систему для начала или то, как вы вызываете ее, предписывается чем-то вроде POSIX.)
Наконец ... Существует также падение производительности, связанное с поиском правильнойпрограмма, создание нового процесса, загрузка программы и т. д. Если вы делаете что-то простое, например mv
, гораздо эффективнее использовать системный вызов напрямую.
Это всего лишь несколько причинчтобы избежать system()
.Конечно, есть и другие.