2013-09-26 234 views
0

我想通過父進程獲取命令並在不同的進程(子進程)中執行它。路徑變量和環境變量

#include<stdio.h> 
#include<sys/types.h> 
#include<fcntl.h> 
#include<unistd.h> 
#include<stdlib.h> 
#include<malloc.h> 

int main(){ 
pid_t pid = -1; 
int status = -1; 
char* ip = malloc(20); 
char* a[20]; 
int pd[2]; 
char* path = NULL; 

path = getenv("PATH"); 
printf("\n path : %s \n",path); 

a[0] = malloc(10); 

while(1){ 
    pipe(pd); 
    pid = fork(); 
    if(pid == 0){ 
    //printf("\n Child! - pid : %d \n",getpid()); 
    sleep(1); 
    close(pd[1]); 
    read(pd[0],ip,20); 
    a[0] = ip; 
    //execl(ip,ip,NULL); 
    execv(path,a); 
    exit(0); 
    } 
    else{ 
    //printf("\n Parent! - pid : %d \n",getpid()); 
    printf("(Enter a executable)$ "); 
    scanf("%s",ip); 
    //printf("\n %s \n",ip); 
    close(pd[0]); 
    write(pd[1],ip,20); 
    waitpid(pid,&status,0); 
    //printf("\n The child %d exited with status : %d \n",pid,status); 
    } 
} 
free(ip); 
return 0; 
} 

路徑和環境有什麼區別。 getenv函數爲我提供了可執行文件的整個路徑。上述程序不執行命令ls -l。

我想執行命令ls -l,輸出應該顯示在屏幕上,並且它應該存儲在一個文件中。 我試圖執行命令ls -l。但它沒有執行。 當在屏幕上輸出時,是否有將ls -l輸出到文件的方法?

+0

返回碼,返回碼,返回碼。用'perror'和/或'strerror'節省自己的時間和精力。 – Duck

+0

環境包含變量名稱及其值的字符串對。 PATH是這些變量之一,包含各種可執行文件的路徑。它可以包含一個或(很可能)*許多*由冒號分隔的路徑。你的'execv'將熄滅。看看你打印出來的路徑。看看你傳遞給'execv'的'a'。然後將它們與'execv'期望的相匹配,並注意到什麼是錯誤的。 – Duck

回答

1

是的,有一種方法可以同時輸出到屏幕和文件,它被稱爲tee

ls -l | tee your_output_file 
+0

這真的是OP要求的嗎? – Duck

+0

我這麼認爲。至少它解決了OP中的最後一個問題。 –

+0

也許吧。很難說。我無法確定這是他想要調試的,還是他希望他的程序寫入兩者。 – Duck

0

你跑execv(path,a),使用path作爲第一個參數,但你已經設置pathPATH環境變量的內容。 PATH是shell搜索可執行文件的目錄列表; execv的第一個參數應該是要調用的可執行文件的路徑。 (或者,execlp和其他一些變體可以搜索`PATH``環境變量。)

您的代碼還存在其他一些問題。它看起來像輸入的全部內容被用作程序的名稱(例如,它將查找具有五個字符名稱「ls -l」的可執行文件),並且將打破長於約20個字符的命令。