2018年8月5日 星期日

system()

system() 讓程式執行 shell 指令。
#include <stdlib.h>

int system(const char *command);
system() 使用系統呼叫 fork() 建立子行程呼叫 execl() 在 shell 下執行 command
execl("/bin/sh", "sh", "-c", command, (char *) 0);
使用 system() 的好處是簡單,不用處理 fork()、exec()、wait()、和 exit() 的細節,不用管錯誤和 signal 處理,也自動進行一般 shell 處理、取代、和轉向。但使用 system() 較沒效率,使用較多系統呼叫,執行一個指令至少需要建立兩個行程,一個是 shell,另外的是每個指令本身都需要 exec()。

回傳值
  • command 是 NULL,回傳 shell 是否存在,有 shell 回傳非 0,沒 shell 回傳 0。
  • 無法建立子行程或無法取得結束碼,回傳 -1。
  • 如果無法在子行程執行 shell,回傳如同 shell 呼叫 _exit(127) 結束。
  • 回傳指令執行後的結束碼。也可能是 127,例如 shell 只不到給定名稱的 program 來執行。
後兩者回傳值跟系統呼叫 waitpid() 有相同定義 (WIFEXITED()、WEXITSTATUS() 等),可用 TLPI §26.1.3 描述的函數來剖析和 printWaitStatus() 顯示。


command 執行期間,SIGCHLD 會 blocked,SIGINT 和 SIGQUIT 會忽略。

參考來源

man system, TLPI §27.6
延伸閱讀

  • 使用 system() 的範例 [TLPI Listing 27-7]
  • system() 可用 fork()、exec()、wait()、和 exit() 實作。[TLPI §27.7]
  • popen() 和 pclose() 也可用來執行 shell 指令,並可以讀取結果或送 input 給指令。[TLPI 44.5]

沒有留言:

張貼留言

SIP header Via

所有 SIP 訊息 都要有 Via,縮寫 v。一開始的 UAC 和後續途經的每個 proxy 都會疊加一個 Via 放傳送的位址,依序作為回應的路徑。 格式 sent-protocol sent-by [ ;branch= branch ][ ; 參數 ...] s...