如何在c中匹配字符串和execvp
您好,我需要使用如何在c中匹配字符串和execvp,c,fork,C,Fork,您好,我需要使用execvp()运行一个程序,问题是我得到了一个sting作为参数 我似乎无法匹配命令的语法来正常工作以下是代码: int executeUserCommand(char *command, int runInBackground) { pid_t pid; int status; pid = fork(); if (pid == 0) { //child process execvp(command, &c
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(“./test1 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;
char*getCommand(char*commandarguments){
char命令[256];
memset(命令,0,线的最大长度);
sscanf(命令和参数,“%s”,命令);
//strncpy(命令、命令和参数、命令-命令和参数);
返回命令;
}
void commandtoarraguments(char*stringToSplit){
const char*p=stringToSplit;
int n,len;
int i=0;
对于(n=0;n<命令的最大数量;n++){
对于(len=0;len
}
commandArgumnets
被定义为全局且仍不工作调用execvp
要求在数组中分隔参数。您只提供了一个参数,它告诉操作系统运行名为/test 1 2 3
的程序,而不是使用参数/test
、1
、2
和3
运行/test
(是的,第0个参数应该是可执行的)
因此,您需要通过将命令拆分为单独的参数来构造字符串数组(可能沿所有空格拆分,可能考虑引号)。如何做到这一点取决于你自己。数组中的每个字符串都应该是一个不带空格的参数
像这样:
char* args[5];
args[0]="./test";
args[1]="1";
args[2]="2";
args[3]="3";
args[4]=NULL;
execvp(args[0],args);
下面是另一个与函数类似的示例:() 注意如何在
main()
中设置argv
,然后将其传递到execute()
。还要注意用于传递argv
的原型<代码>字符**在您的版本中使用类似的参数类型(即字符串数组)
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 */
}
}
void执行(字符**argv)
{
pid_t pid;
智力状态;
如果((pid=fork())<0){/*fork子进程*/
printf(“***错误:分叉子进程失败\n”);
出口(1);
}
如果(pid==0){/*子进程:*/
如果(execvp(*argv,argv)<0{/*执行命令*/
printf(“***错误:exec失败\n”);
出口(1);
}
}
else{/*对于父级:*/
while(等待(&status)!=pid)/*等待完成*/
;
}
}
真空总管(真空)
{
字符行[1024];/*输入行*/
char*argv[64];/*命令行参数*/
而(1){/*重复,直到完成*/
printf(“Shell->”);/*显示提示*/
获取(行);/*在命令行中读取*/
printf(“\n”);
解析(行,argv);/*解析行*/
if(strcmp(argv[0],“exit”)==0)/*是否为“exit”*/
退出(0);/*如果是,则退出*/
执行(argv);/*否则,执行命令*/
}
}