Я хочу использовать функцию execl
для вызова обеих команд cd и vi из моей программы на языке C, но она не работает. Вот что я сделал для rm и ls:
execl("/bin/ls", "ls", NULL);
execl("/bin/rm", "rm", args[1], NULL); //args is the array containing the arguments of the command
Это работает для ls
и rm
, но когда я пытаюсь сделать то же самое с vi
и cd
, это не работает.
cd
иvi
не совпадают по коду сls
иrm
. - person Eugene Sh.   schedule 22.09.2017cd
, это не сработает, отчасти потому, чтоcd
является встроенной в оболочку, а не отдельной программой, которую вы можете выполнять, а также потому, что если вы измените каталог в подпроцессе, это не повлияет на родительский процесс ( именно поэтому он должен быть встроен в оболочку).vi
, с другой стороны, должен был работать, если только, возможно, не было проблем с доступом к терминалу - поскольку, конечно, это очень интерактивная программа. - person Steve Summit   schedule 22.09.2017vi
? Можете ли вы показать нам точный код, который вы использовали для этого? - person Steve Summit   schedule 22.09.2017/usr/bin/cd
, но она имеет очень и очень ограниченное применение — команда меняет каталог, но не влияет на вызывающую программу. (Если я запускаю/usr/bin/cd /some/where/non-existent
, он выдает сообщение об ошибке/usr/bin/cd: line 4: cd: /some/where/non-existent: No such file or directory
. Таким образом, его можно использовать для проверки существования и доступности целевого каталога, но это все. И да, это сценарий оболочки.) - person Jonathan Leffler   schedule 22.09.2017execl()
очень часто. Вам нужно будет использоватьexecv()
,execvp()
,execve()
илиexecvpe()
в зависимости от контекста и того, что доступно. - person Jonathan Leffler   schedule 22.09.2017exec*
одну за другой, поскольку в хорошем случае они просто не возвращаются. - person Eugene Sh.   schedule 22.09.2017execl("/bin/ls", "ls", (char*)NULL);
для редких платформ, которые не делаютNULL
того же размера/кодировки, что иchar*
. OTOH, у такой машины может не бытьexecl()
. - person chux - Reinstate Monica   schedule 22.09.2017