国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Linux > 正文

Linux啟動新進程的三種方法

2019-10-26 18:52:08
字體:
來源:轉載
供稿:網友

程序中,我們有時需要啟動一個新的進程,來完成其他的工作。

下面介紹了三種實現方法,以及這三種方法之間的區別。

1.system函數-調用shell進程,開啟新進程

system函數,是通過啟動shell進程,然后執行shell命令進程。

原型:

int system(const char *string);

string:shell命令字符串

返回值:成功返回命令退出碼,無法啟動shell,返回127錯誤碼,其他錯誤,返回-1。

代碼示例如下:

process_system.c

#include<stdlib.h>                               #include<stdio.h>int main(){    printf("Running ps with system/n");    int code = system("ps au");//新進程結束后,system函數才返回    //int code = system("ps au");//system函數立即返回    printf("%d/n",code);    printf("ps Done/n");    exit(0);}

輸出結果:

system函數,在啟動新進程時,必須先啟動shell進程,因此使用system函數的效率不高。

2.exec系列函數-替換進程映像

exec系列函數調用時,啟動新進程,替換掉當前進程。即程序不會再返回到原進程,

除非exec調用失敗。

exec啟動的新進程繼承了原進程的許多特性,如在原進程中打開的文件描述符在新進程中仍保持打開。

需要注意的是,在原進程中打開的文件流在新進程中將關閉。原因在于,我們在前面講過進程間通信的方式,進程之間需要管道才能通信。

原型:

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(cosnt char *path,char *const argv[]);int execvp(cosnt char *file,char *const argv[]);int execve(cosnt char *path,char *const argv[],char *const envp[]);

path/file:進程命令路徑/進程命令名

argc:命令參數列表

envp:新進程的環境變量

代碼示例如下:

process_exec.c

#include<stdio.h>int main(){  printf("Running ps with execlp/n");  execlp("ps","ps","au",(char*)0);  printf("ps done");  exit(0);}

輸出結果:

可以看出,調用execlp函數后,原進程被新進程替換,原進程中printf("ps done");沒有被執行到。

3.fork函數-復制進程映像

1)fork函數的使用

fork和exec的替換不同,調用fork函數,可復制一個和父進程一模一樣的子進程。

執行的代碼也完全相同,但子進程有自己的數據空間,環境和文件描述符。

原型:

pid_t fork();

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 定襄县| 泾阳县| 正镶白旗| 偃师市| 高州市| 墨玉县| 德庆县| 额尔古纳市| 兴仁县| 应用必备| 天台县| 巩义市| 兴城市| 遂昌县| 格尔木市| 务川| 灌云县| 华宁县| 射阳县| 布拖县| 偃师市| 大埔县| 凤翔县| 清原| 灵寿县| 乐都县| 昌黎县| 磴口县| 湖南省| 当雄县| 金阳县| 郧西县| 聂拉木县| 襄汾县| 定襄县| 新田县| 东海县| 古田县| 盈江县| 涿州市| 阜城县|