У меня есть массив из командных строк, которые я хочу выполнить с помощью вызова execvp()
:Выполнение команды с execvp
char* commands[] = ["ls -l", "ps -a", "ps"];
char* command = commands[0];
...
Как выполнить команду с execvp
?
У меня есть массив из командных строк, которые я хочу выполнить с помощью вызова execvp()
:Выполнение команды с execvp
char* commands[] = ["ls -l", "ps -a", "ps"];
char* command = commands[0];
...
Как выполнить команду с execvp
?
Вот пример использования для вас. Это берет команду для выполнения из своих аргументов или вы можете раскомментировать пример жесткого кодирования.
Я рекомендую вам просмотреть используемые команды на соответствующих страницах руководства. Для execvp
, декларация
int execvp(const char *file, char *const argv[]);
argv[0]
должны быть такими же, как file
по соглашению и argv
должны быть NULL
-завершённый.
#include <stdlib.h> //exit
#include <stdio.h> //perror
#include <unistd.h>
#include <sysexits.h>
#include <errno.h>
#include <sys/wait.h>
int main(int argc, char** argv){
int pid, status, ret;
if((pid=fork())<0) { perror("fork"); exit(EX_OSERR); }
if(!pid){ //Child
/*
char* args[] = { "ps", "-a", (char*)0 };
execvp(args[0], args);
*/
//Execute arguments, already NULL terminated
execvp(argv[1], argv+1);
//exec doesn't exit; if it does, it's an error
perror(argv[1]);
//Convert exec failure to exit status, shell-style (optional)
switch(errno){
case EACCES: exit(126);
case ENOENT: exit(127);
default: exit(1);
}
}
//Wait on child
waitpid(pid, &status, 0);
//Return the same exit status as child did or convert a signal termination
//to status, shell-style (optional)
ret = WEXITSTATUS(status);
if (!WIFEXITED(status)) {
ret += 128;
ret = WSTOPSIG(status);
if (!WIFSTOPPED(status)) {
ret = WTERMSIG(status);
}
}
return ret;
}
Вы должны отделить команду и аргументы в отдельные строки: '{ "LS", "-l", NULL}' и 'вилка()' и 'execvp()' один раз для каждой командной строки вы хотите выполнить. Вам не хватает указателя «NULL» в конце. Последняя запись массива 'char * commands []' должна быть указателем NULL. –
Если вы должны были запустить команду из командной строки, как бы она выглядела? – dbush
если бы я запускал его из командной строки, это было бы просто «ls -l», – user3133300