2013-12-18 50 views
1

我想寫execl功能的包裝,但該命令不運行(與execl直接它的工作原理)寫作EXECL()函數的包裝,有怪異的結果

於是我加了一個vfprintf用於調試目的。但是vfprintf僅打印/bin/ls,所以我認爲它在中間的某處被截斷。

我的代碼有什麼問題?

int my_execl(const char *file, const char *format, ...) 
{ 
    int ret = 0; 

    va_list args; 
    va_start (args, format); 
    vfprintf (stdout, format, args); 
    ret = execl (file, format, args); 
    va_end (args); 

    return ret; 
} 

int main (int argc , char **argv) 
{ 
    my_execl ("/bin/ls", "/bin/ls", "-r", "-t", NULL); 
    return 0; 
} 
+2

中有['exec'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/exec.html)家族沒有函數,它接受的格式規範和一個'va_list'參數。 –

+0

'vprintf'只打印'「/ bin/ls」'是因爲這是格式字符串,字符串中沒有實際的格式或額外的參數。 –

+0

如果你真的需要編寫一個包裝器(你爲什麼要這樣做?),你必須手動構造參數列表並調用例如['execv'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/exec.html)。 –

回答

1

您必須手動構造參數列表並調用如execv 與它。 - 勒夫Pileborg

#include <stdarg.h> 
#include <unistd.h> 

int my_execl(const char *file, ...) 
{ 
    int ret; 
    va_list args; 
    va_start(args, file); 
    ret = execv(file, (char **)args); 
    va_end(args); 
    return ret; 
}