2012-11-18 30 views
0

我想傳遞給ls命令execl()函數的參數。但是當我通過命令行參數沒有得到執行在C

/bin/ls -l -a 

作爲我的程序的參數,execl()函數不能識別最後兩個參數。爲什麼?代碼如下:

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

int main(int argc, char *argv[]) 
{ 
int i,childpid; 

if(argc!=4) 
{ 
    printf("you didn't provide any commandline arguments!\n"); 
    return 0; 
} 

childpid=fork(); 

if(childpid<0) 
{ 
    printf("fork() failed\n"); 
    return 0; 
} 
else 
    if(childpid==0) 
    { 
     printf("My ID %d\n\n",getpid()); 
     execl(argv[1],argv[2], argv[3],NULL); 

     printf("If you can see this message be ware that Exec() failed!\n"); 
    } 

    while(wait(NULL)>0); 

    printf("My ID %d, Parent ID %d, CHild ID %d\n", getpid(),getppid(),childpid); 

    return 0; 
} 

我在Ubuntu上。

問候

回答

2

當運行程序/bin/ls似乎忽略-l參數,因爲它被傳遞給保留爲argv[0]的位置,這通常是(相當無用的)程序名。

具體來說,execl的第一個參數是要運行的程序,其餘參數按原樣複製到argv向量中。由於argv[0]預計將包含該程序的名稱和實際參數從argv[1]開始,你必須通過兩次提供程序名稱補償:

execl(argv[1], argv[1], argv[2], argv[3], (char *) NULL); 
+0

我沒有將char轉換爲null *,但仍然執行ls - 一個在終端,並通過他們的程序和通過execl運行是不同的 – Alfred

+0

@阿爾弗雷德我不認爲失蹤的演員曾經是真正的問題;不重複'argv [1]'是。這是在答案中解釋的,這與我的答案與Desert Ice和hmjd的答案不同。 – user4815162342

1

一個代碼錯誤是使用NULL作爲最後一個參數來execl()。從man execl:在EXECL

的爲const char * ARG和隨後的省略號(),execlp()和execle()函數可以被認爲是爲arg0,ARG1,...,ARGN。它們一起描述了一個或多個指向以空字符結尾的字符串的指針列表,這些字符串表示可供執行的程序使用的參數列表。按照慣例,第一個參數應指向與正在執行的文件關聯的文件名。 參數列表必須以NULL指針終止,並且,由於這些是可變參數函數,因此必須將此指針強制轉換(char *)NULL。

見從C FAQ,這在其實施例具體提到excel()問題How do I get a null pointer in my programs?

+0

+1很有意思,但就是傳遞指針之間的區別的' int'在堆棧上? – iabdalkader

+0

我沒有將char *轉換爲null,但仍然通過在終端中執行ls -a -l並將它們傳遞給程序並通過execl運行得到的結果不同 – Alfred

0

代碼不爲我工作,直到我添加#include<unistd.h>

據我瞭解的功能EXEC,EXECL等被宣佈在unistd.h中,而不是在stdlib.h中。

如果我只用stdlib.h和stdio.h編譯,我會得到警告。

test.c: In function ‘main’: test.c:24:9: warning: incompatible implicit declaration of built-in function ‘execl’ [enabled by default]

那裏,如果你添加unistd.h中,而exec調用改變

execl(argv[1], argv[1], argv[2], argv[3],NULL);

你的程序應該工作。