2014-02-19 152 views
1
char *args[41]; 
char str[41], teststr[41]; 
const char delimiter[2]=" "; 
memcpy(teststr, str, sizeof(str)); 
args[i]=strtok(teststr, delimiter); 
while(args[i]!=NULL) 
{ 
    printf("args[%d]=%s\n", i, args[i]); 
    i++; 
    args[i]=strtok(NULL, delimiter); 
} 

这是我用来初始化args []的代码。execvp()系统调用不执行

下面的代码是执行execvp()系统调用。

pid=fork(); 
if(pid==0) 
{ 
    execvp(args[0], args); 
} 

当我运行代码时,execvp运行几个命令。比如当我尝试执行'ls'命令时,它会工作,但是当我尝试运行'date'命令或'cd'命令时,它不起作用。当我尝试执行'cat'命令时,提示不会显示任何内容,同时也不会显示出来。

+0

'cd'永远不会与'exec'和朋友一起工作,因为这个命令是由于进程无法更改其父进程的工作目录而被内置到shell中的。 'date'也可能是这种情况,但'cat'应该可以正常工作。显然,在你实际显示的代码中,'str'永远不会被实际填充或初始化,所以这根本不应该工作。你也应该使用'strcpy()'来填充'args'(这意味着改变'args'的定义来分配内存),而不是存储指向'strtok()'要修改的字符串的指针。 –

+0

行,但事情是,在猫的情况下,我给命令myshell> cat shell.c其中myshell是我正在创建一个shell。当我运行这个命令时,它会进入子进程但永远不会出现,也不会显示输出。 – Malhar

+0

'''是用于shell重定向的,如果你试图将它作为命令行参数传递,它显然不起作用。 –

回答

0

看起来你对于如何得到你的观点有问题,但由于你没有显示你的意见,所以很难说清楚。 strtok()修改您传递给它的字符串,因此存储指向您要修改的字符串的指针看起来很麻烦。

这会做你想要什么:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 

#define MAX_BUFFER_LEN 1024 
#define MAX_ARGS 100 

int main(void) { 
    char command[MAX_BUFFER_LEN]; 

    printf("myshell> "); 
    fflush(stdout); 
    fgets(command, MAX_BUFFER_LEN, stdin); 
    command[strlen(command) - 1] = '\0'; 

    char * args[MAX_ARGS]; 
    char * temparg; 
    int i = 0; 

    temparg = strtok(command, " "); 
    while (temparg) { 
     args[i] = strdup(temparg); 
     ++i; 
     temparg = strtok(NULL, " "); 
    } 

    i = 0; 
    while (args[i] != NULL) { 
     printf("Argument %d: %s\n", i + 1, args[i]); 
     ++i; 
    } 

    pid_t my_pid = fork(); 
    if (my_pid == 0) { 
     execvp(args[0], args); 
    } 

    wait(NULL); 

    return EXIT_SUCCESS; 
} 

,输出:

[email protected]:~/Documents/src/scratch$ ./exectest 
myshell> cat exectest.c 
Argument 1: cat 
Argument 2: exectest.c 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 

#define MAX_BUFFER_LEN 1024 
#define MAX_ARGS 100 

int main(void) { 
    char command[MAX_BUFFER_LEN]; 

    printf("myshell> "); 
    fflush(stdout); 
    fgets(command, MAX_BUFFER_LEN, stdin); 
    command[strlen(command) - 1] = '\0'; 

    char * args[MAX_ARGS]; 
    char * temparg; 
    int i = 0; 

    temparg = strtok(command, " "); 
    while (temparg) { 
     args[i] = strdup(temparg); 
     ++i; 
     temparg = strtok(NULL, " "); 
    } 

    i = 0; 
    while (args[i] != NULL) { 
     printf("Argument %d: %s\n", i + 1, args[i]); 
     ++i; 
    } 

    pid_t my_pid = fork(); 
    if (my_pid == 0) { 
     execvp(args[0], args); 
    } 

    wait(NULL); 

    return EXIT_SUCCESS; 
} 

[email protected]:~/Documents/src/scratch$ 

错误检查不再赘述。

+0

是的,谢谢。这个解决方案的工作原理,现在我知道为什么我的代码不工作。那是因为我的str不是NULL终止的 – Malhar