В чем разница между вышеуказанными способами выполнения команды и приведенным ниже кодом?
#include
int main ( )
{
int return_value;
return_value = system ( "ls /" );
return return_value;
}
1 ответ
system("ls /")
создаст процесс sh
, передав ему аргументы -c
и ls /
. Таким образом, основное различие между запуском вашей программы и вводом sh -c "ls /"
в оболочке состоит в том, что в первом случае также существует процесс, содержащий вашу программу. Так что, если бы вы могли захватить дерево процессов во время работы ls
, вы бы увидели что-то вроде этого:
init───konsole───bash───myprog───sh───ls
вместо
init───konsole───bash───sh───ls
Если вы используете одну из функций семейства exec
, вы можете вообще отказаться от использования sh
и заменить свою программу утилитой ls
. В этом случае вы увидите:
init───konsole───bash───ls
Программа может выглядеть так:
int main(int argc, char** argv) {
return execlp("ls", "ls", "/");
}
Многие оболочки, включая bash
будут делать это автоматически, если команда, выполняемая с помощью параметра -c
является простой командой. Тем не менее , нет смысла порождая оболочки с целью замены оболочки с процессом , который вы могли бы просто exec
Существует очень небольшая разница между sh -c "ls -l"
и sh ls-l.sh
, за исключением того, что необходимо для открытия файла для чтения.