2011-04-10 220 views
7

我想在我的c程序中運行shell命令。但事情是,我不想讓我的程序等待命令執行。不需要讀取shell命令的輸出(無論如何它都不返回數據)所以基本上,這是可能的嗎?在c程序中運行shell命令

+1

順便說一句,如果你想運行一個shell命令或其他可執行文件,這並不重要。不管你使用'system()'還是'fork()/ exec()'方法,只需要一個可執行文件。也許你想相應地編輯你的問題的標題? – Jens 2011-04-12 21:29:26

回答

5

fork()system()是你所需要的

+0

可能與exec()或其變體一起使用。 – PhD 2011-04-10 01:12:17

+1

'system'會讓子進程等待shell命令 - 'exec'會用shell替換子進程。 – rlc 2011-04-10 01:13:09

+0

@Ronald:沒有。它用另一個進程替換子進程。從OP中不清楚他是要運行另一個程序還是一個shell命令行,但如果是後者,那麼只有system()會做到這一點。 exec不涉及shell。 – 2011-04-10 01:15:33

5

當然,只是forkexec:使用fork創建一個新的進程,在子進程中,使用exec開始與您的命令外殼。 execv需要你通常給shell的參數。

您的代碼看起來是這樣的:當它死亡

pid_t child_pid = fork(); 
if (child_pid == 0) 
{ // in child 
    /* set up arguments */ 
    // launch here 
    execv("/bin/sh", args); 
    // if you ever get here, there's been an error - handle it 
} 
else if (child_pid < 0) 
{ // handle error 
} 

子進程將發出一個SIGCHLD信號。此代碼從POSIX標準(SUSv4)報價將處理的是:

static void 
handle_sigchld(int signum, siginfo_t *sinfo, void *unused) 
{ 
    int status; 

    /* 
    * Obtain status information for the child which 
    * caused the SIGCHLD signal and write its exit code 
    * to stdout. 
    */ 
    if (sinfo->si_code != CLD_EXITED) 
    { 
     static char msg[] = "wrong si_code\n"; 
     write(2, msg, sizeof msg - 1); 
    } 
    else if (waitpid(sinfo->si_pid, &status, 0) == -1) 
    { 
     static char msg[] = "waitpid() failed\n"; 
     write(2, msg, sizeof msg - 1); 
    } 
    else if (!WIFEXITED(status)) 
    { 
     static char msg[] = "WIFEXITED was false\n"; 
     write(2, msg, sizeof msg - 1); 
    } 
    else 
    { 
     int code = WEXITSTATUS(status); 
     char buf[2]; 
     buf[0] = '0' + code; 
     buf[1] = '\n'; 
     write(1, buf, 2); 
    } 
} 
+0

exec不涉及shell。假設OP想要運行ls | grep -v你好'。這將與系統一起工作,但不適用於exec。 – 2011-04-10 01:17:48

+0

OP可以將這些傳遞給shell - 系統做同樣的事情(但在後臺執行另一個'fork'&'exec')。 – rlc 2011-04-10 01:22:21

1

嘗試這樣的代碼:

#include <stdlib.h> 
#include <unistd.h> 
int main(int argc, char ** argv) 
{ 
    if (!fork()) 
    { 
     execv("ls", {"myDir"}); /* Your command with arguments instead of ls. */ 
    } 
} 
+2

這讓我覺得太快和骯髒,因爲這會從命令退出直到主退出時創建一個殭屍進程。一個行爲良好的Unix程序會希望避免這種情況。查看使用'waitpid'的其他答案。 – Jens 2011-04-13 11:38:17

+0

對不起。我對* nix APIs並不是很滿意:)。 – JackMc 2011-04-14 02:02:06

1

什麼簡單的功放與system ("command &")的命令?