В чем разница между вышеуказанными способами выполнения команды и приведенным ниже кодом?
#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 , за исключением того, что необходимо для открытия файла для чтения.
