有時候,我們需要在自己的程序(進程)中啟動另一個程序(進程)來幫助我們完成一些工作,那么我們需要怎么才能在自己的進程中啟動其他的進程呢?在Linux中提供了不少的方法來實現這一點,下面就來介紹一個這些方法及它們之間的區別。
一、system函數調用
system函數的原型為:
#include <stdlib.h> int system (const char *string);
它的作用是,運行以字符串參數的形式傳遞給它的命令并等待該命令的完成。命令的執行情況就如同在shell中執行命令:sh -c string。如果無法啟動shell來運行這個命令,system函數返回錯誤代碼127;如果是其他錯誤,則返回-1。否則,system函數將返回該命令的退出碼。
注意:system函數調用用一個shell來啟動想要執行的程序,所以可以把這個程序放到后臺中執行,這里system函數調用會立即返回。
可以先先下面的例子,源文件為new_ps_system.c,代碼如下:
#include <stdlib.h> #include <stdio.h> int main() { printf("Running ps with system/n"); //ps進程結束后才返回,才能繼續執行下面的代碼 system("ps au");// 1 printf("ps Done/n"); exit(0); } 該程序調用ps程序打印所有與本用戶有關的進程,最后才打印ps Done。運行結果如下:

如果把注釋1的語句改為:system("ps au &");則system函數立即返回,不用等待ps進程結束即可執行下面的代碼。所以你看到的輸出,ps Done可能并不是出現在最后一行,而是在中間。
一般來說,使用system函數不是啟動其他進程的理想手段,因為它必須用一個shell來啟動需要的程序,即在啟動程序之前需要先啟動一個shell,而且對shell的環境的依賴也很大,因此使用system函數的效率不高。
二、替換進程映像——使用exec系列函數
exec系列函數由一組相關的函數組成,它們在進程的啟動方式和程序參數的表達方式上各有不同。但是exec系列函數都有一個共同的工作方式,就是把當前進程替換為一個新進程,也就是說你可以使用exec函數將程序的執行從一個程序切換到另一個程序,在新的程序啟動后,原來的程序就不再執行了,新進程由path或file參數指定。exec函數比system函數更有效。
exec系列函數的類型為:
#include <unistd.h> char **environ; int execl (const char *path, const char *arg0, ..., (char*)0); int execlp(const char *file, const char *arg0, ..., (char*)0); int execle(const char *path, const char *arg0, ..., (char*)0, char *const envp[]); int execv (const char *path, char *const argv[]); int execvp(cosnt char *file, char *const argv[]); int execve(const char *path, char *const argv[], char *const envp[]);
新聞熱點
疑難解答