天天看點

linux程序程式設計:子程序建立及執行函數簡介

linux程序程式設計:子程序建立及執行函數簡介

    子程序建立及執行函數有三個:

(1)fork();

(2)exec();

(3)system();

    下面分别做詳細介紹。

(1)fork()

    函數定義:

    pid_t fork();

    函數說明:

    linux下程序在記憶體中由三部分資料組成:代碼段、資料段、堆棧段。在一個程序中,調用fork函數,可以建立、啟動一個新程序。新程序與父程序共享代碼段,複制父程序的資料段和堆棧段。建立成功後,fork()會向兩個程序都有傳回值。向父程序的傳回值為子程序的進行号,向子程序的傳回值為0。由于兩個程序共享代碼段,我們就利用兩個傳回值的不同,通過if...else...區分兩程序在子程序啟動後的運作情況。

    傳回值:

    建立成功後,fork()會向兩個程序都有傳回值。向父程序的傳回值為子程序的進行号,向子程序的傳回值為0。函數調用失敗傳回值為-1。錯誤原因存在于errno中。

(2)exec()函數族

    exec函數族共6個函數,函數原型:

    int execl(const char *path, const char *arg, ...);

    int execlp(const char *file, const char *arg, ...);

    int execle(const char *path, const char *arg, ..., char *const envp[]);

    int execv(const char *path, char *const arg[]);

    int execvp(const char *file, char *const arg[]);

    int execve(const char *path, char *const arg[], char *const envp[]);

    函數族說明:

    exec()函數族通過指定路徑或檔案名的方式找到并執行一個可執行檔案。該可執行檔案可以使二進制檔案或linux系統下可執行的shell腳本檔案,一旦執行即替代原程序代碼,廢除原程序資料段和堆棧段,但仍然沿用原程序的程序号。換句話說,原程序運作的程式已經換成了新的程式,但對系統而言還是同一個程序。如果我們的程式向啟動另一個程式的執行,還想原程序繼續運作,可以将fork和exec結合使用,先建立新程序,然後再新程序中使用exec調用需要啟動的程式。

    函數傳回值:

    exec()函數族的函數執行成功後沒有傳回值,調用失敗時才會傳回-1,原程式由調用點繼續往下執行。

(3)system()

    int system(const char *file);

    system()相當于fork與execl的組合。首先由fork()函數建立了一個子程序,然後由execl()函數根據參數file給定的檔案名找到并執行可執行檔案。

    system()與exec函數族都可執行程序外的指令,差別是system()函數在原程式上建立一個新的程序,再在新程序中執行可執行檔案;而exec函數族是在新開辟的程序中植入新代碼替代原程式代碼。

    函數調用成功傳回0;調用失敗傳回-1。若傳回值的8~15位為127,則system()中的execl函數執行失敗。

繼續閱讀