婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Linux啟動新進程的幾種方法及比較

Linux啟動新進程的幾種方法及比較

熱門標簽:怎么用百度地圖標注坐標 春運地圖標注app 地圖標注人員分布 江西全自動外呼系統(tǒng)報價 梧州防封電銷卡 益陽400電話申請辦理流程 400的電話一般從哪里辦理 上海機器人外呼系統(tǒng)哪家好 昆明電銷機器人價格

有時候,我們需要在自己的程序(進程)中啟動另一個程序(進程)來幫助我們完成一些工作,那么我們需要怎么才能在自己的進程中啟動其他的進程呢?在Linux中提供了不少的方法來實現(xiàn)這一點,下面就來介紹一個這些方法及它們之間的區(qū)別。

一、system函數(shù)調用

system函數(shù)的原型為:

#include stdlib.h> 
int system (const char *string); 

它的作用是,運行以字符串參數(shù)的形式傳遞給它的命令并等待該命令的完成。命令的執(zhí)行情況就如同在shell中執(zhí)行命令:sh -c string。如果無法啟動shell來運行這個命令,system函數(shù)返回錯誤代碼127;如果是其他錯誤,則返回-1。否則,system函數(shù)將返回該命令的退出碼。

注意:system函數(shù)調用用一個shell來啟動想要執(zhí)行的程序,所以可以把這個程序放到后臺中執(zhí)行,這里system函數(shù)調用會立即返回。

可以先先下面的例子,源文件為new_ps_system.c,代碼如下:

#include stdlib.h> 
#include stdio.h> 
int main() 
{ 
  printf("Running ps with system\n"); 
  //ps進程結束后才返回,才能繼續(xù)執(zhí)行下面的代碼 
  system("ps au");// 1 
  printf("ps Done\n"); 
  exit(0); 
} 

該程序調用ps程序打印所有與本用戶有關的進程,最后才打印ps Done。運行結果如下:

如果把注釋1的語句改為:system("ps au ");則system函數(shù)立即返回,不用等待ps進程結束即可執(zhí)行下面的代碼。所以你看到的輸出,ps Done可能并不是出現(xiàn)在最后一行,而是在中間。

一般來說,使用system函數(shù)不是啟動其他進程的理想手段,因為它必須用一個shell來啟動需要的程序,即在啟動程序之前需要先啟動一個shell,而且對shell的環(huán)境的依賴也很大,因此使用system函數(shù)的效率不高。

二、替換進程映像——使用exec系列函數(shù)

exec系列函數(shù)由一組相關的函數(shù)組成,它們在進程的啟動方式和程序參數(shù)的表達方式上各有不同。但是exec系列函數(shù)都有一個共同的工作方式,就是把當前進程替換為一個新進程,也就是說你可以使用exec函數(shù)將程序的執(zhí)行從一個程序切換到另一個程序,在新的程序啟動后,原來的程序就不再執(zhí)行了,新進程由path或file參數(shù)指定。exec函數(shù)比system函數(shù)更有效。

exec系列函數(shù)的類型為:

#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[]); 

這類函數(shù)可以分為兩大類,execl、execlp和execle的參數(shù)是可變的,以一個空指針結束,而execv、execvp和execve的第二個參數(shù)是一個字符串數(shù)組,在調用新進程時,argv作為新進程的main函數(shù)的參數(shù)。而envp可作為新進程的環(huán)境變量,傳遞給新的進程,從而變量它可用的環(huán)境變量。

承接上一個例子,如果想用exec系統(tǒng)函數(shù)來啟動ps進程,則這6個不同的函數(shù)的調用語句為:

注:arg0為程序的名字,所以在這個例子中全為ps。

char *const ps_envp[] = {"PATH=/bin:usr/bin", "TERM=console", 0}; 
char *const ps_argv[] = {"ps", "au", 0}; 
 
execl("/bin/ps", "ps", "au", 0); 
execlp("ps", "ps", "au", 0); 
execle("/bin/ps", "ps", "au", 0, ps_envp); 
 
execv("/bin/ps", ps_argv); 
execvp("ps", ps_argv); 
execve("/bin/ps", ps_argv, ps_envp); 

下面我給出一個完整的例子,源文件名為new_ps_exec.c,代碼如下:

#include unistd.h> 
#include stdio.h> 
#include stdlib.h> 
 
int main() 
{ 
  printf("Running ps with execlp\n"); 
  execlp("ps", "ps", "au", (char*)0); 
  printf("ps Done"); 
  exit(0); 
} 

運行結果如下:

細心的話,可以發(fā)現(xiàn),最后的ps Done并沒有輸出,這是偶然嗎?并不是,因為我們并沒有再一次返回到程序new_ps_exec.exe上,因為調用execlp函數(shù)時,new_ps_exec.exe進程被替換為ps進程,當ps進程結束后,整個程序就結束了,并沒有回到原來的new_ps_exec.exe進程上,原本的進程new_ps_exec.exe不會再執(zhí)行,所以語句printf("ps Done");根本沒有機會執(zhí)行。

注意,一般情況下,exec函數(shù)是不會返回的,除非發(fā)生錯誤返回-1,由exec啟動的新進程繼承了原進程的許多特性,在原進程中已打開的文件描述符在新進程中仍將保持打開,但任何在原進程中已打開的目錄流都將在新進程中被關閉。

三、復制進程映像——fork函數(shù)

1、fork函數(shù)的應用

exec調用用新的進程替換當前執(zhí)行的進程,而我們也可以用fork來復制一個新的進程,新的進程幾乎與原進程一模一樣,執(zhí)行的代碼也完全相同,但新進程有自己的數(shù)據(jù)空間、環(huán)境和文件描述符。

fork函數(shù)的原型為:

#include sys/type.h> 
#include unistd.h> 
 
pid_t fork(); 

注:在父進程中,fork返回的是新的子進程的PID,子進程中的fork返回的是0,我們可以通過這一點來判斷父進程和子進程,如果fork調用失敗,它返回-1.

繼承上面的例子,下面我給出一個調用ps的例子,源文件名為new_ps_fork.c,代碼如下:

#include unistd.h> 
#include sys/types.h> 
#include stdio.h> 
#include stdlib.h> 
int main() 
{ 
  pid_t pid = fork(); 
  switch(pid) 
  { 
  case -1: 
    perror("fork failed"); 
    exit(1); 
    break; 
  case 0: 
    //這是在子進程中,調用execlp切換為ps進程 
    printf("\n"); 
    execlp("ps", "ps", "au", 0); 
    break; 
  default: 
    //這是在父進程中,輸出相關提示信息 
    printf("Parent, ps Done\n"); 
    break; 
  } 
  exit(0); 
} 

輸出結果為:

我們可以看到,之前在第二點中沒有出現(xiàn)的ps Done是打印出來了,但是順序卻有點不對,這是因為,父進程先于子程序執(zhí)行,所以先輸出了Parent, ps Done,那有沒有辦法讓它在子進程輸出完之后再輸出,當然有,就是用wait和waitpid函數(shù)。注意,一般情況下,父進程與子進程的生命周期是沒有關系的,即便父進程退出了,子進程仍然可以正常運行。

2、等待一個進程

wait函數(shù)和waitpid函數(shù)的原型為:

#include sys/types.h> 
#include sys/wait.h> 
 
pid_t wait(int *stat_loc); 
pid_t waitpid(pid_t pid, int *stat_loc, int options); 

wait用于在父進程中調用,讓父進程暫停執(zhí)行等待子進程的結束,返回子進程的PID,如果stat_loc不是空指針,狀態(tài)信息將被寫入stat_loc指向的位置。

waitpid等待進程id為pid的子進程的結束(pid為-1,將返回任一子進程的信息),stat_loc參數(shù)的作用與wait函數(shù)相同,options用于改變waitpid的行為,其中有一個很重要的選項WNOHANG,它的作用是防止waippid調用者的執(zhí)行掛起。如果子進程沒有結束或意外終止,它返回0,否則返回子進程的pid。

改變后的程序保存為源文件new_ps_fork2.c,代碼如下:

#include unistd.h> 
#include sys/types.h> 
#include stdio.h> 
#include stdlib.h> 
 
int main() 
{ 
  pid_t pid = fork(); 
  int stat = 0; 
  switch(pid) 
  { 
  case -1: 
    perror("fork failed"); 
    exit(1); 
    break; 
  case 0: 
    //這是在子進程中,調用execlp切換為ps進程 
    printf("\n"); 
    execlp("ps", "ps", "au", 0); 
    break; 
  default: 
    //這是在父進程中,等待子進程結束并輸出相關提示信息 
    pid = wait(stat); 
    printf("Child has finished: PID = %d\n", pid); 
    //檢查子進程的退出狀態(tài) 
    if(WIFEXITED(stat)) 
      printf("Child exited with code %d\n", WEXITSTATUS(stat)); 
    else 
      printf("Child terminated abnormally\n"); 
    printf("Parent, ps Done\n"); 
    break; 
  } 
  exit(0); 
} 

輸出為:

可以看到這次的輸出終于正常了,Parent的輸出也在子進程的輸出之后。

總結——三種啟動新進程方法的比較

首先是最簡單的system函數(shù),它需要啟動新的shell并在新的shell是執(zhí)行子進程,所以對環(huán)境的依賴較大,而且效率也不高。同時system函數(shù)要等待子進程的返回才能執(zhí)行下面的語句。

exec系統(tǒng)函數(shù)是用新的進程來替換原先的進程,效率較高,但是它不會返回到原先的進程,也就是說在exec函數(shù)后面的所以代碼都不會被執(zhí)行,除非exec調用失敗。然而exec啟動的新進程繼承了原進程的許多特性,在原進程中已打開的文件描述符在新進程中仍將保持打開,但需要注意,任何在原進程中已打開的目錄流都將在新進程中被關閉。

fork則是用當前的進程來復制出一個新的進程,新進程與原進程一模一樣,執(zhí)行的代碼也完全相同,但新進程有自己的數(shù)據(jù)空間、環(huán)境變量和文件描述符,我們通常根據(jù)fork函數(shù)的返回值來確定當前的進程是子進程還是父進程,即它并不像exec那樣并不返回,而是返回一個pid_t的值用于判斷,我們還可以繼續(xù)執(zhí)行fork后面的代碼。感覺用fork與exec系列函數(shù)就能創(chuàng)建很多需的進程。

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!

您可能感興趣的文章:
  • 解決Linux下php-fpm進程過多導致內存耗盡問題
  • linux下如何創(chuàng)建守護進程的步驟
  • 詳解Linux如何查看當前占用CPU或內存最多的幾個進程
  • Linux查找占用的端口,并殺死進程的方法
  • Linux啟動新進程的三種方法
  • linux下的C\C++多進程多線程編程實例詳解
  • Linux創(chuàng)建進程達到65535的方法

標簽:河南 惠州 九江 北京 亳州 贛州 新疆 懷化

巨人網(wǎng)絡通訊聲明:本文標題《Linux啟動新進程的幾種方法及比較》,本文關鍵詞  Linux,啟動,新進程,新,進程,;如發(fā)現(xiàn)本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Linux啟動新進程的幾種方法及比較》相關的同類信息!
  • 本頁收集關于Linux啟動新進程的幾種方法及比較的相關信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    7777精品伊人久久久大香线蕉的| 一本色道久久综合亚洲91| 狠狠色狠狠色综合系列| 色哟哟国产精品| 国产精品久久久久久久久晋中| 五月天激情综合网| 色一情一乱一乱一91av| 成人免费小视频| 国产成人综合自拍| 国产精品免费视频网站| 国产盗摄女厕一区二区三区| 亚洲国产岛国毛片在线| 91美女视频网站| 亚洲va韩国va欧美va| 欧美一区二区三区免费| 国产精品自产自拍| 亚洲女同ⅹxx女同tv| 日韩一区二区视频在线观看| 蜜桃视频一区二区三区| 中文字幕欧美日韩一区| 在线免费不卡电影| 激情图片小说一区| 国产精品女同互慰在线看| 色av一区二区| 91原创在线视频| 午夜精品久久久久久久| 中文字幕免费在线观看视频一区| av中文字幕亚洲| 久久精品国产精品青草| 中文字幕欧美一| 精品国产亚洲在线| 欧美一区二区视频观看视频| 91黄色小视频| 99精品热视频| 国产不卡在线播放| 国内精品伊人久久久久av一坑 | 午夜精品久久久久久久99水蜜桃 | 国内成人精品2018免费看| 亚洲午夜一二三区视频| 国产欧美日韩精品一区| 日韩丝袜美女视频| 国产女主播一区| 国产日韩欧美高清| 日本一区二区免费在线| 国产精品乱码一区二区三区软件| 26uuu成人网一区二区三区| 日韩视频一区二区三区在线播放| 欧美精三区欧美精三区| 欧美一区二区观看视频| ww久久中文字幕| 亚洲三级小视频| 亚洲午夜av在线| 另类综合日韩欧美亚洲| 国产69精品久久99不卡| 91激情五月电影| 久久精品视频一区二区| 一区二区三区中文字幕在线观看| 亚洲激情图片小说视频| 免费看欧美美女黄的网站| 一本久道久久综合中文字幕| 欧美一级高清片在线观看| 国产精品乱码一区二三区小蝌蚪| 午夜精品久久久| 在线免费观看一区| 一区二区激情视频| 成人高清视频在线观看| 精品福利一二区| 日韩av一区二区三区四区| 欧美三级午夜理伦三级中视频| 亚洲精品一区二区三区蜜桃下载| 综合色中文字幕| av电影一区二区| 亚洲欧美一区二区三区孕妇| 国产69精品一区二区亚洲孕妇| 日韩欧美国产系列| 亚洲chinese男男1069| 91在线视频观看| 国产精品久久久久久久久晋中| 福利视频网站一区二区三区| 久久亚洲春色中文字幕久久久| 精品在线播放午夜| 欧美白人最猛性xxxxx69交| 久久国产精品色| 久久综合九色综合欧美98 | 精品午夜一区二区三区在线观看| 在线播放91灌醉迷j高跟美女 | 国产精品一区免费在线观看| 久久综合国产精品| 成人av电影在线网| 日韩精品欧美成人高清一区二区| 欧美少妇bbb| 国产一二三精品| 亚洲毛片av在线| 日韩免费视频一区| 91丨九色丨黑人外教| 青青草国产成人99久久| 国产精品麻豆一区二区| 欧美va亚洲va| 成人网页在线观看| 蜜臀av国产精品久久久久| 亚洲一卡二卡三卡四卡无卡久久| 欧美成人一区二区三区片免费| 99视频精品免费视频| 韩国av一区二区三区在线观看| 亚洲高清在线视频| 国产日韩精品视频一区| 久久综合色天天久久综合图片| 99国产精品国产精品毛片| 国产专区欧美精品| 免费在线成人网| 天天影视色香欲综合网老头| 日韩美女精品在线| 亚洲一区在线看| 一区二区三区加勒比av| 国产精品欧美极品| 亚洲三级免费电影| 色噜噜狠狠色综合欧洲selulu| 五月天久久比比资源色| 国产一区二区在线视频| 国产精品亚洲一区二区三区妖精| 国产精品一区二区果冻传媒| 欧美综合天天夜夜久久| 亚洲另类中文字| 日韩一区有码在线| 一区二区三区中文字幕精品精品 | 91精品综合久久久久久| 91精品办公室少妇高潮对白| 欧美午夜片在线看| 91麻豆精品国产自产在线| 亚洲精品一区二区三区影院| 亚洲精品在线电影| 日韩毛片精品高清免费| 日韩中文字幕区一区有砖一区 | 精品国产三级电影在线观看| 国产精品乱码一区二区三区软件 | 亚洲高清免费观看高清完整版在线观看| 国产精品九色蝌蚪自拍| 亚洲午夜电影网| 成人app下载| 精品sm在线观看| 免费人成在线不卡| 欧美精品成人一区二区三区四区| 久久综合久久久久88| 亚洲主播在线播放| 成人小视频在线| 国产日产欧美一区| 国产精品1区2区3区在线观看| 欧美日韩mp4| 香蕉加勒比综合久久| 91精品国产综合久久蜜臀| 中文字幕欧美国产| 中文字幕一区日韩精品欧美| 中文字幕中文乱码欧美一区二区 | 久久国产精品99久久久久久老狼| 国产精品天美传媒沈樵| 精品少妇一区二区三区免费观看| 97久久久精品综合88久久| 日日夜夜免费精品视频| 国产三区在线成人av| eeuss鲁片一区二区三区在线观看| 亚洲欧美日韩国产综合在线 | 亚洲免费看黄网站| 色婷婷国产精品久久包臀| 一区二区三区免费看视频| 欧美精品三级日韩久久| 黄网站免费久久| 国产精品福利av| 成人黄色av电影| 午夜激情综合网| 26uuuu精品一区二区| 99久久精品免费精品国产| 日韩一区精品字幕| 一区二区三区高清| 亚洲色图视频网站| 亚洲国产日韩一区二区| 免费高清成人在线| 欧美国产乱子伦| 一本一道综合狠狠老| 国产在线一区二区| 欧美老年两性高潮| 中文字幕一区在线| 欧美影视一区在线| 成人精品电影在线观看| 国产一区二区三区在线观看免费| 午夜影院在线观看欧美| 亚洲3atv精品一区二区三区| 亚洲视频电影在线| 亚洲午夜精品在线| 一个色综合av| 亚洲激情在线播放| 一区二区三区日韩精品| 亚洲色图一区二区三区| 国产精品久久久久久亚洲毛片| 久久久久青草大香线综合精品| 日韩一级高清毛片| 亚洲人成人一区二区在线观看| 日本91福利区| 欧美日韩免费在线视频| 久久久影视传媒| 视频在线观看国产精品|