1
命令我有命令字符串我想執行的數組通過調用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}'和'fork()的'和'execvp()'一次執行。你最後缺少一個'NULL'指針。 char * commands []'數組的最後一項必須是NULL指針。 –
如果您要從命令行運行命令,它會是什麼樣子? – dbush
如果我要從命令行運行它,它只會是「ls -l」 – user3133300