你好我需要运行一个程序使用execvp()的东西是我得到一个sting作为参数,我似乎无法匹配命令的语法,以正常工作这里是代码:
int executeUserCommand(char *command, int runInBackground) {
pid_t pid;
int status;
pid = fork();
if (pid == 0) {
//child process
execvp(command, &command);
exit(1);
} else {
//perent
if (!runInBackground) {
waitpid(pid, &status, 0);
return WEXITSTATUS(status);
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我正在使用executeUserCommand("./test 1 2 3", 0)
的是程序正在运行但没有参数..问题是什么以及我如何解决它?
编辑:我添加了两个功能,以帮助我分裂,它仍然无法正常工作.
char *getCommand(char *commandAndArguments) {
char command[256];
memset(command,0,MAX_LENGTH_OF_LINE);
sscanf(commandAndArguments,"%s ", command);
//strncpy(command, commandAndArguments, command - commandAndArguments);
return command;
}
void commandToArrguments(char *stringToSplit) {
const char *p = stringToSplit;
int n, len;
int i = 0;
for (n = 0; n < MAX_NUMBER_OF_COMMANDS; n++) {
for (len=0; len < MAX_LENGTH_OF_LINE-1; len++) {
if (p[0] == '\0') {
break;
}
if (p[0] == ' ') {
p += 1;
break;
}
commandArgumnets[n][len] = *p;
p++;
}
commandArgumnets[n][len] = '\0';
}
}
int executeUserCommand(char *command, int runInBackground) {
pid_t pid;
int status;
pid = fork();
char *commandToExecute = getCommand(command);
if (pid == 0) {
//child process
execvp(commandToExecute, commandArgumnets);
exit(1);
} else {
//perent
if (!runInBackground) {
waitpid(pid, &status, 0);
return WEXITSTATUS(status);
}
}
return 0;
Run Code Online (Sandbox Code Playgroud)
}
commandArgumnets 被定义为全局但仍无效
的execvp呼叫预计参数在阵列中分离出来.你只提供一个参数,它告诉OS运行调用程序./test 1 2 3,而不是运行./test与参数./test,1,2,和3(是的,第0个参数应该是可执行文件).
因此,您需要通过将命令拆分为单独的参数来构造字符串数组(可能沿着所有空格分割,可能会考虑引号).你如何做到这一点取决于你.数组中的每个字符串应该只是一个没有空格的参数.
像这样:
char* args[5];
args[0]="./test";
args[1]="1";
args[2]="2";
args[3]="3";
args[4]=NULL;
execvp(args[0],args);
Run Code Online (Sandbox Code Playgroud)