2013-10-04 66 views
0

是否有實現一個函數調用一個fork()execve()沒有簡單的方法?像system(),但沒有幕後的所有shell的東西。叉高管與易用性系統的()

+0

是它的簡單代碼超過10行?我不完全確定你在這裏尋找什麼 - C不是包含大量電池的一種語言! –

+0

性能你所擔心的是什麼? –

+1

使用庫。例如巧舌如簧有一個非常漂亮組[進程產卵功能(https://developer.gnome.org/glib/stable/glib-Spawning-Processes.html),使得它很容易。 – unwind

回答

2
pid_t 
fork_and_execve(const char *path, char *const argv[], char *const envp[]) 
{ 
    pid_t child_pid; 
    child_pid = fork(); 
    if (0 == child_pid) { 
     execve(path, argv, envp); 
    } else { 
     return child_pid; 
    } 
} 

注意,如果execve()調用失敗

+0

我知道如何編寫fork-execve樣板代碼。我想用一個標準的電話來避免它。 – Guy

+2

答案是沒有一個。在UNIX進程產卵完成由叉execve的,你可能會發現,實現上述樣板庫,但沒有系統調用,它如此。 – dnaq

2

當然這個代碼不處理:

pid_t start(char *cmd, char **argv, char **envp) { 
    pid_t child = fork(); 
    if(child == 0) { 
     execve(cmd, argv, envp); 
     _exit(1); 
    } 
    return child; 
} 

int invoke(char *cmd, char **argv, char **envp) { 
    int status; 
    waitpid(start(cmd, argv, envp), &status); 
    return status; 
} 
0

對於POSIX系統存在posix_spawn()

的posix_spawn( )posix_spawnp ()函數應該從指定的過程映像創建一個新的進程(子進程)。新的進程映像應從稱爲新工藝 圖像文件的常規可執行文件來構建。