2014-02-19 153 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