2015-11-19 72 views
1

到目前爲止,我的代碼在用戶輸入時處理ls命令。我希望能夠處理像ls -l /tmp這樣的命令。 我的代碼到目前爲止。處理命令,如ls -l/somedir

#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <sys/wait.h> 
#include <stdarg.h> 
#include <sys/types.h> 


int main(void) 
{ 
for(;;){ 
char str[500]; 
printf("Type a command : \n"); 
scanf("%s",str); 
char *path; 
    path = getenv("PATH"); 
    char *argv[] = { path ,NULL}; 

    int status; 
    int pid = fork(); 

     if (pid == 0) { 
printf("executing==============> %s \n",str); 
      execvp(str,argv); 
} 
wait(&status); 
} 
} 

任何想法?我必須這樣做,沒有system()

+1

首先,你應該使用'scanf函數( 「%s」 時,STR);'代替。你的代碼工作,因爲在這種情況下,'str'和'&str'具有相同的地址。 當你調用'execvp'時,你需要傳遞你想運行的命令和一個字符串數組作爲參數,每個字符串都是該命令的一個參數。 P.S .:通常用所需的命令啓動陣列。例如'char * argv [] = {str,「-l」,「/ tmp」,NULL};' – ddz

+0

'char * argv [] = {str,「-l」,「/ tmp」,NULL}; '當我輸入'ls'時,它直接執行'ls -l/tmp'。我想要的是能夠像'ls','pwd' **和'ls -l/somedir' @LuizEduardoF這樣的命令來處理命令。 –

+0

請參閱下面的答案。 – ddz

回答

0

這爲我工作:

所有的
#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <sys/wait.h> 
#include <stdarg.h> 
#include <sys/types.h> 
#define MAX_NAME_SZ 256 

int main(void) 
{ 
char *str,*ret, *pa1, *pa2, *dtm ,*pa3; 
str=(char *)malloc(50*sizeof(char)); 
ret=(char *)malloc(50*sizeof(char)); 
pa1=(char *)malloc(50*sizeof(char)); 
pa2=(char *)malloc(50*sizeof(char)); 
dtm=(char *)malloc(50*sizeof(char)); 
pa3=(char *)malloc(50*sizeof(char)); 
char ch =' ' ; 
printf("Type a command : \n"); 

    fgets (str, MAX_NAME_SZ, stdin); 

    if ((strlen(str)>0) && (str[strlen (str) - 1] == '\n')) 
     str[strlen (str) - 1] = '\0'; 
    ret = strchr(str, ch); 

    if (ret !=NULL) 
    { 
     strcpy(dtm, str); 
     sscanf(dtm, "%s %s %s ", pa1, pa2,pa3 ); 
     } 

    char *path; 
    path = getenv("PATH"); 

    int status=2; 
    int pid = fork(); 

    if (pid == 0) { 
     if (ret !=NULL){ 
      char *argv[] = { path ,pa2, pa3 ,NULL}; 
       execvp(pa1,argv); 

       } 
     else { 
      char *argv[] = { path ,NULL}; 
      execvp(str,argv); 

     } 
    } 
    wait(&status); 

    } 
2

execvp系統調用期望作爲其參數的一個字符串,該命令包含一個字符串數組,該數組字符串以該命令開頭,後面跟着參數,一個接一個,以NULL字符串結尾。

在你的情況,這將是:

char *argv[] = {"ls", "-l", "/tmp", NULL}; 

請記住,這段代碼只是什麼是幕後的說明。您需要根據用戶的輸入構建argv[]

您可以合併strchr()以標記輸入(查找空格),然後使用sscanf來讀取字符串的一部分。然後,您必須將輸入指針更新爲由strchr() + 1返回的值,並使用sscanf()來讀取命令的下一部分。

1

您可以輕鬆地使用system(str)來做到這一點。

它叉,呼叫execl("/bin/sh", "sh". "-c", command, (char *) 0);並在命令完成後返回。

當它調用shell時,它也支持shell內置函數。

+0

我必須在沒有'system()'的情況下執行它。 –

+0

使用'system(command)'使你的程序在那一刻停下來,等待'command'執行。使用fork()來執行它可以讓你的進程創建一個子進程,並使用子進程PID爲你運行另一個程序,因此如果主進程想要做別的事情,主進程不必等待子進程退出。另外,你應該考慮'execvp()'系統調用的影響。 – ddz

0

使用相同的「系統」功能。系統(str)應該可能工作。 該函數創建一個單獨的線程,執行提供給它的命令。 有關詳細信息,請參閱「man system」。

+0

我必須在沒有'system()'的情況下執行它。 –