2012-11-21 28 views
1

下面的代碼調用LS應該調用命令excve由於某種原因,我不打印當前目錄中的內容,但仍程序返回"ok"與execve的

1 #include <stdio.h> 
    2 #include <unistd.h> 
    3 int main() 
    4 { char *argv[]={"ls",NULL};· 
    5 char *env[]={"PATH=/usr/local/sbin/:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games",NULL}; 
    6 if(execve("ls",argv,env)) 
    7 { printf("ok\n"); 
    8 } 
    9 else 
10 { printf("not ok\n"); 
11 } 
12 return 0; 
13 }  

回答

3

由於execve沒有成功返回,顯然這個調用失敗了。它在錯誤時返回-1,將被視爲true(非零)。這就是爲什麼它說好。

最可能的原因是您沒有指定可執行文件的完整路徑,這是execve的要求。或者,如果您想要搜索路徑,請改爲使用execvpe。血腥的細節見http://linux.die.net/man/3/exec

1

的execve返回-1錯誤當在需要布爾值的上下文中使用時,它的計算結果爲true。但是,檢查返回值沒有意義,因爲如果execve成功,則不會返回。

可能在這種情況下,它失敗了,因爲您沒有提供'ls'的完整路徑。

2

調用exec在成功時不會返回。你基本上用你正在使用的程序替換調用程序。

因此,如果您曾經運行任何代碼執行,它意味着exec失敗。我相信exec返回-1,這就是爲什麼你最終打印好。

1

這並不真正使多大意義

if(execve("ls",argv,env) >0) { 
    printf("ok\n"); 
} else { 
    printf("not ok\n"); 
} 

如果他們成功了所有exec函數不返回,所以如果它返回它意味着它失敗了,你也不需要檢查它是否返回-1,第二個問題是,第一個參數是execve()文件路徑不是命令名,從這個男人:

的execve()執行程序的文件名指出到。

所以,你只需要:

execve("/bin/ls", argv, env); 
/* execve() only returns on error */ 
perror("execve"); 
exit(EXIT_FAILURE);