您好我需要使用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;
}
我正在使用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;
}
commandArgumnets
被定义为全局且仍无效
答案 0 :(得分:8)
execvp
调用期望参数在数组中分离出来。您只提供一个参数,它告诉操作系统运行名为./test 1 2 3
的程序,而不是使用参数./test
,./test
,{{1}运行1
}和2
(是的,第0个参数应该是可执行文件)。
因此,您需要通过将命令拆分为单独的参数来构造字符串数组(可能在所有空格中拆分,也许需要考虑引号)。你如何做到这一点取决于你。数组中的每个字符串应该只是一个没有空格的参数。
像这样:
3
答案 1 :(得分:0)
以下是与您的函数类似的另一个示例:(From Here)
注意argv
中main()
的设置方式,然后传递给execute()
。另请注意原型用于传递argv
... char **
在您的版本中使用类似的参数 类型(即字符串数组)。
void execute(char **argv)
{
pid_t pid;
int status;
if ((pid = fork()) < 0) { /* fork a child process */
printf("*** ERROR: forking child process failed\n");
exit(1);
}
else if (pid == 0) { /* for the child process: */
if (execvp(*argv, argv) < 0) { /* execute the command */
printf("*** ERROR: exec failed\n");
exit(1);
}
}
else { /* for the parent: */
while (wait(&status) != pid) /* wait for completion */
;
}
}
void main(void)
{
char line[1024]; /* the input line */
char *argv[64]; /* the command line argument */
while (1) { /* repeat until done .... */
printf("Shell -> "); /* display a prompt */
gets(line); /* read in the command line */
printf("\n");
parse(line, argv); /* parse the line */
if (strcmp(argv[0], "exit") == 0) /* is it an "exit"? */
exit(0); /* exit if it is */
execute(argv); /* otherwise, execute the command */
}
}