成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

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

Linux啟動新進(jìn)程的幾種方法及比較

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

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

一、system函數(shù)調(diào)用

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ù)調(diào)用用一個shell來啟動想要執(zhí)行的程序,所以可以把這個程序放到后臺中執(zhí)行,這里system函數(shù)調(diào)用會立即返回。

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

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

該程序調(diào)用ps程序打印所有與本用戶有關(guān)的進(jìn)程,最后才打印ps Done。運行結(jié)果如下:

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

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

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

exec系列函數(shù)由一組相關(guān)的函數(shù)組成,它們在進(jìn)程的啟動方式和程序參數(shù)的表達(dá)方式上各有不同。但是exec系列函數(shù)都有一個共同的工作方式,就是把當(dāng)前進(jìn)程替換為一個新進(jìn)程,也就是說你可以使用exec函數(shù)將程序的執(zhí)行從一個程序切換到另一個程序,在新的程序啟動后,原來的程序就不再執(zhí)行了,新進(jìn)程由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ù)是可變的,以一個空指針結(jié)束,而execv、execvp和execve的第二個參數(shù)是一個字符串?dāng)?shù)組,在調(diào)用新進(jìn)程時,argv作為新進(jìn)程的main函數(shù)的參數(shù)。而envp可作為新進(jìn)程的環(huán)境變量,傳遞給新的進(jìn)程,從而變量它可用的環(huán)境變量。

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

注: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); 
} 

運行結(jié)果如下:

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

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

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

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

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

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

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

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

繼承上面的例子,下面我給出一個調(diào)用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: 
    //這是在子進(jìn)程中,調(diào)用execlp切換為ps進(jìn)程 
    printf("\n"); 
    execlp("ps", "ps", "au", 0); 
    break; 
  default: 
    //這是在父進(jìn)程中,輸出相關(guān)提示信息 
    printf("Parent, ps Done\n"); 
    break; 
  } 
  exit(0); 
} 

輸出結(jié)果為:

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

2、等待一個進(jìn)程

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用于在父進(jìn)程中調(diào)用,讓父進(jìn)程暫停執(zhí)行等待子進(jìn)程的結(jié)束,返回子進(jìn)程的PID,如果stat_loc不是空指針,狀態(tài)信息將被寫入stat_loc指向的位置。

waitpid等待進(jìn)程id為pid的子進(jìn)程的結(jié)束(pid為-1,將返回任一子進(jìn)程的信息),stat_loc參數(shù)的作用與wait函數(shù)相同,options用于改變waitpid的行為,其中有一個很重要的選項WNOHANG,它的作用是防止waippid調(diào)用者的執(zhí)行掛起。如果子進(jìn)程沒有結(jié)束或意外終止,它返回0,否則返回子進(jìn)程的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: 
    //這是在子進(jìn)程中,調(diào)用execlp切換為ps進(jìn)程 
    printf("\n"); 
    execlp("ps", "ps", "au", 0); 
    break; 
  default: 
    //這是在父進(jìn)程中,等待子進(jìn)程結(jié)束并輸出相關(guān)提示信息 
    pid = wait(stat); 
    printf("Child has finished: PID = %d\n", pid); 
    //檢查子進(jìn)程的退出狀態(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的輸出也在子進(jìn)程的輸出之后。

總結(jié)——三種啟動新進(jìn)程方法的比較

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

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

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

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

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

標(biāo)簽:河南 惠州 九江 北京 亳州 贛州 新疆 懷化

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Linux啟動新進(jìn)程的幾種方法及比較》,本文關(guān)鍵詞  Linux,啟動,新進(jìn)程,新,進(jìn)程,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Linux啟動新進(jìn)程的幾種方法及比較》相關(guān)的同類信息!
  • 本頁收集關(guān)于Linux啟動新進(jìn)程的幾種方法及比較的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    欧美精品一区二区成人| 国自产拍偷拍福利精品免费一| 在线观看欧美理论a影院| 欧美黄色一级大片| 日韩妆和欧美的一区二区| 亚洲午夜久久久影院伊人| 成人日韩视频| 路边理发店露脸熟妇泻火| 婷婷综合五月天| www.久久草.com| 中文字幕 亚洲视频| 亚洲精品国精品久久99热一| jizz日本免费| jizz视频在线观看| 国产精品色噜噜| 成人高潮成人免费观看| 日韩美一区二区三区| 亚洲国产精品久久人人爱| 3d成人h动漫网站入口| 亚洲精品一级片| 亚洲视频在线免费观看| fc2成人免费视频| 欧美日韩国产三级| 麻豆中文字幕在线观看| 欧美日韩亚洲一| 国产在线观看欧美| 久久国产乱子伦免费精品| 久久久久国产精品视频| 日韩在线精品| 国产一区二区三区自拍| 少妇高潮 亚洲精品| 麻豆国产在线| 欧美国产一区二区在线| 欧美xxxxbbbb| 久久影院在线观看| 色在线视频观看| 日韩成人av网站| 亚洲综合视频在线| 99久久综合狠狠综合久久aⅴ| 国产乱码77777777| 日日日日人人人夜夜夜2017| av黄色免费在线观看| 亚洲综合在线观看视频| 高h放荡受浪受bl| 天堂av在线7| 一区二区在线免费| 97精品国产97久久久久久粉红| 国产美女www爽爽爽| 欧美综合一区二区| 91精品国产综合久久香蕉的特点| 国产成人精品久久二区二区| 欧美激情1区2区3区| 亚洲综合中文字幕68页| 精品久久97| 黑人巨大猛交丰满少妇| 久久久不卡网国产精品二区| 日韩电影在线观看一区| 国产经典三级在线| 日韩 欧美 视频| 日本在线视频播放| 国产精品白浆流出视频| 国产一区网站| 欧美成人午夜激情视频| 精品国产免费人成电影在线观...| 亚洲成人在线网站| 韩国一区二区在线播放| 日韩欧美亚洲一区二区三区| 日韩av不卡一区| 最近中文字幕免费视频| 亚洲欧美激情小说另类| 成人字幕网zmw| 亚洲第一区在线| 国产亚洲精品久久777777| 久久久久久久久久久久久久久久久久av| 国产美女特级嫩嫩嫩bbb片| 51色欧美片视频在线观看| 久久精品最新地址| 女女同性女同一区二区三区91| 日韩高清一级片| 亚洲欧美在线一区二区| 国产毛片在线| 欧美午夜一区二区三区免费大片| 亚洲毛片在线| 亚洲网站在线看| 国产亚洲精品美女久久久久| 亚洲a∨精品一区二区三区导航| 国产亚洲欧美另类中文| 黄色精品视频| 国产乱码精品一区二区三区忘忧草| 欧美男女交配| 国产ts丝袜人妖系列视频| 蜜桃视频网站在线| 欧美日韩破处视频| 夫妇交换中文字幕| 国产a级片免费看| 最新av中文字幕| 黄色一级片一级片| 久久久久久无码午夜精品直播| 日韩av成人在线观看| 国产精品美女一区| 国产专区中文字幕| 国产精品乱码一区二区| 国产尤物视频在线| 免费的黄色片| 97久久夜色精品国产| 国产精品乱码人人做人人爱| www.久久草.com| 欧美日韩在线免费观看视频| 国产成人欧美在线观看| 欧美精品粉嫩高潮一区二区| av免费播放网址| 日本黄色片视频| 午夜激情电影在线播放| 亚洲精品一区二区三区av| 日本成人精品视频| 日韩一区二区三区三四区视频在线观看| 88xx成人永久免费观看| 日本免费在线视频| 韩国av免费观看| 欧美妇女性影城| 小嫩嫩精品导航| 精品国产aⅴ| 91视频在线免费观看| 欧美videos另类齐全| 成人免费观看a| 欧美日韩另类丝袜其他| 亚洲第一在线综合在线| 成人亚洲欧美一区二区三区| 欧美日韩午夜视频在线观看| 亚洲69av| 亚洲欧美日韩网| 久久久久久久高清| 国产不卡一二三区| 一夜七次郎国产精品亚洲| 免费看的毛片| 91佛爷在线| 国产精品久久久久久久久免费| 欧美日韩国产黄| 亚洲另类图片另类电影| 搞黄在线观看| 一本一道波多野毛片中文在线| 亚洲日本在线视频观看| 国产毛片视频| 诱受h嗯啊巨肉高潮| 亚洲国产精品毛片| 男人操女人免费| 秋霞电影一区二区| 性生活三级视频| 国产区欧美区日韩区| 中日精品一色哟哟| 可以在线观看的av| 黄在线免费看| 美洲精品一卡2卡三卡4卡四卡| 国产欧美1区2区3区| 激情五月婷婷在线| 久久久久国产一区二区三区四区| 日韩欧美一区二区三区不卡视频| 欧美日韩三级| 久久无码av三级| 国产69精品99久久久久久宅男| 网站永久看片免费| www.看毛片| 成人国产精品入口免费视频| 99日在线视频| 91网站黄www| 国产专区在线视频| 亚洲一区美女视频在线观看免费| 国产成人免费91av在线| 日本丰满大乳奶| 少妇献身老头系列| 中文字幕久久综合| 国产成人精彩在线视频九色| 亚洲一本视频| 国产一卡二卡3卡4卡四卡在线| 在线播放亚洲一区| 亚洲一区二区三区精品中文字幕| 亚洲大型综合色站| 国产视频一区二区三区在线观看| 精品国产国产综合精品| 国产欧美日韩一区二区三区四区| 九色porny丨国产首页在线| 精品一区二区影视| 黄网址在线永久免费观看| 亚洲精品国产av| 亚洲va韩国va欧美va精四季| 久久久久影视| 国产精品一区二区在线播放| 三级黄色的网站| 国产一线二线三线在线观看| 成人午夜三级| 蜜桃一区二区三区在线| 波兰性xxxxx极品hd| 国产一区二区三区在线观看精品| 日韩在线资源网| 国产美女免费网站| 素人av在线| 免费观看又色又爽又黄的网站| 亚洲一区在线看| 亚洲国产精品影视| 欧美性猛交丰臀xxxxx网站| 一本一本久久a久久精品牛牛影视| 激情久久久久久久| 久久久久久欧美精品色一二三四| 中国a一片一级一片| 91精品久久香蕉国产线看观看| 久久久久久国产精品免费播放| 国产对白videos麻豆高潮| 免费中文字幕在线| 久久免费少妇高潮99精品| 97超碰免费在线观看| 蜜桃av中文字幕| 久久久久久国产精品久久| 人妻激情另类乱人伦人妻| 精品国产999久久久免费| 国产区亚洲区欧美区| 国产精品自产拍在线观看中文| 最近2019中文字幕一页二页| 五月婷婷综合在线| 美女久久久久久久久久久| 国产欧美自拍一区| 精品国产乱子伦| 欧美一级成年大片在线观看| 精品日韩成人av| 亚洲黄页一区| 精品国产一区二区三区四区| 亚洲一区二区伦理| 亚洲男人的天堂在线视频| 国产高清一级片| 成人黄色动漫| 9色精品在线| 好吊妞国产欧美日韩免费观看网站| 加勒比一区二区三区在线| 成人亚洲网站| 国产精品99导航| 午夜3点看的视频| www夜片内射视频日韩精品成人| 影音先锋中文字幕在线| 97色在线视频观看| 四虎成人影院网址| 天堂a√在线| 五月天婷婷激情网| 日本女优北野望在线电影| 97在线超碰| 国模无码国产精品视频| aaa国产精品| 欧美日免费三级在线| 黄网站app在线观看下载视频大全官网| 精品国产户外野外| 天堂免费在线视频| 中文字幕永久在线视频| 古装做爰无遮挡三级聊斋艳谭| 欧美一区国产| 国产精品福利小视频| 中文字幕亚洲日本| 色偷偷色偷偷色偷偷在线视频| 国产欧美日韩一级| www国产精品内射老熟女| 欧美午夜女人视频在线| 国内欧美日韩| 日韩av高清在线播放| 成人小视频免费观看| 在线免费观看日韩欧美| 国产精品白嫩美女在线观看| 久久精品视频2| 国产精品国产三级国产普通话对白| 亚洲免费视频观看| 免费看av在线| 狠狠久久伊人中文字幕| 欧美高清视频一区二区三区在线观看| 国产三级电影在线| 亚洲综合精品久久| 91偷拍一区二区三区精品| 波多野结衣与黑人| 日韩欧美成人一区| 日韩视频在线观看免费视频| 亚洲久久成人| 中文字幕欧美在线观看| 五月婷婷深爱五月| 国产成人免费看一级大黄| 久久精品国产综合精品| 欧美国产精品一区二区| jizz亚洲| 国产精品高清亚洲| 主播国产精品| 超碰caoprom| 国产ts一区| 国产亚洲黄色片| 91久久精品www人人做人人爽| 精品少妇一区二区三区在线视频| 成人免费毛片日本片视频| 可以直接看的av网址站| 亚洲精品视频99| 日韩伦人妻无码| 欧美激情xxxx性bbbb| 国产精品51麻豆cm传媒| 亚洲狼人综合干| 国产成人精品最新| 欧美亚洲国产bt| 日韩av男人天堂| 国产日产一区二区| 国产精品伦理一区二区| 国产传媒视频在线观看| 国产亚洲精久久久久久无码77777| 久久久999国产精品| 成人看片免费| 国产精品性做久久久久久| 国产欧美精品xxxx另类| h网址在线观看| 成人区精品一区二区婷婷| 久久精品亚洲精品国产欧美kt∨| 激情久久久久久久久久久久久久久久| 中文字幕一区在线| 一二三四视频免费观看在线看| 91久久精品一区二区二区| 亚洲国产综合色| 国产女主播在线直播| 久久国产精品久久久久久小说| 中文字幕日韩精品一区| 亚洲国产精品一区在线观看不卡| 九九九九精品| 天天干天天色天天爽| 国产亚洲一区二区三区在线观看| 欧美日韩在线视频观看| 亚洲视频福利| 在线观看日本www| 林心如三级全黄裸体| 91精品综合久久久久久五月天| 无码人妻aⅴ一区二区三区玉蒲团|