青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 40, 文章 - 0, 評(píng)論 - 9, 引用 - 0
數(shù)據(jù)加載中……

unix多進(jìn)程2

linux下的多進(jìn)程編程(2007-5-21,11:17:55)
什么是一個(gè)進(jìn)程?進(jìn)程這個(gè)概念是針對(duì)系統(tǒng)而不是針對(duì)用戶的,對(duì)用戶來說,他面對(duì)的概念是程序。當(dāng)用戶敲入命令執(zhí)行一個(gè)程序的時(shí)候,對(duì)系統(tǒng)而言,它將啟動(dòng)一個(gè)進(jìn)程。但和程序不同的是,在這個(gè)進(jìn)程中,系統(tǒng)可能需要再啟動(dòng)一個(gè)或多個(gè)進(jìn)程來完成獨(dú)立的多個(gè)任務(wù)。多進(jìn)程編程的主要內(nèi)容包括進(jìn)程控制和進(jìn)程間通信,在了解這些之前,我們先要簡單知道進(jìn)程的結(jié)構(gòu)。
2.1 Linux下進(jìn)程的結(jié)構(gòu)
Linux下一個(gè)進(jìn)程在內(nèi)存里有三部分的數(shù)據(jù),就是"代碼段"、"堆棧段"和"數(shù)據(jù)段".其實(shí)學(xué)過匯編語言的人一定知道,一般的CPU都有上述三種段寄存器,以方便操作系統(tǒng)的運(yùn)行。這三個(gè)部分也是構(gòu)成一個(gè)完整的執(zhí)行序列的必要的部分。
"代碼段",顧名思義,就是存放了程序代碼的數(shù)據(jù),假如機(jī)器中有數(shù)個(gè)進(jìn)程運(yùn)行相同的一個(gè)程序nokia s40 主題下載,那么它們就可以使用相同的代碼段。"堆棧段"存放的就是子程序的返回地址、子程序的參數(shù)以及程序的局部變量。而數(shù)據(jù)段則存放程序的全局變量,常數(shù)以及動(dòng)態(tài)數(shù)據(jù)分配的數(shù)據(jù)空間(比如用malloc之類的函數(shù)取得的空間)。這其中有許多細(xì)節(jié)問題,這里限于篇幅就不多介紹了。系統(tǒng)如果同時(shí)運(yùn)行數(shù)個(gè)相同的程序,它們之間就不能使用同一個(gè)堆棧段和數(shù)據(jù)段。
2.2 Linux下的進(jìn)程控制
在傳統(tǒng)的Unix環(huán)境下,有兩個(gè)基本的操作用于創(chuàng)建和修改進(jìn)程:函數(shù)fork( )用來創(chuàng)建一個(gè)新的進(jìn)程,該進(jìn)程幾乎是當(dāng)前進(jìn)程的一個(gè)完全拷貝;函數(shù)族e(cuò)xec( )用來啟動(dòng)另外的進(jìn)程以取代當(dāng)前運(yùn)行的進(jìn)程。Linux的進(jìn)程控制和傳統(tǒng)的Unix進(jìn)程控制基本一致,只在一些細(xì)節(jié)的地方有些區(qū)別手機(jī)和絢鈴聲,例如在Linux系統(tǒng)中調(diào)用vfork和fork完全相同,而在有些版本的Unix系統(tǒng)中,vfork調(diào)用有不同的功能。由于這些差別幾乎不影響我們大多數(shù)的編程,在這里我們不予考慮。
2.2.1 fork( )
fork在英文中是"分叉"的意思。為什么取這個(gè)名字呢?因?yàn)橐粋€(gè)進(jìn)程在運(yùn)行中,如果使用了fork,就產(chǎn)生了另一個(gè)進(jìn)程,于是進(jìn)程就"分叉"了,所以這個(gè)名字取得很形象。下面就看看如何具體使用fork,這段程序演示了使用fork的基本框架:
void main(){
int i;
if ( fork() == 0 ) {
/* 子進(jìn)程程序 */
for ( i = 1; i <1000; i ++ ) printf("This is child process ");
}
else {
/* 父進(jìn)程程序*/
for ( i = 1; i <1000; i ++ ) printf("This is process process ");
}
}
程序運(yùn)行后,你就能看到屏幕上交替出現(xiàn)子進(jìn)程與父進(jìn)程各打印出的一千條信息了。如果程序還在運(yùn)行中,你用ps命令就能看到系統(tǒng)中有兩個(gè)它在運(yùn)行了。 那么調(diào)用這個(gè)fork函數(shù)時(shí)發(fā)生了什么呢?fork函數(shù)啟動(dòng)一個(gè)新的進(jìn)程,前面我們說過,這個(gè)進(jìn)程幾乎是當(dāng)前進(jìn)程的一個(gè)拷貝:子進(jìn)程和父進(jìn)程使用相同的代碼段;子進(jìn)程復(fù)制父進(jìn)程的堆棧段和數(shù)據(jù)段。這樣,父進(jìn)程的所有數(shù)據(jù)都可以留給子進(jìn)程,但是,子進(jìn)程一旦開始運(yùn)行,雖然它繼承了父進(jìn)程的一切數(shù)據(jù),但實(shí)際上數(shù)據(jù)卻已經(jīng)分開,相互之間不再有影響了,也就是說,它們之間不再共享任何數(shù)據(jù)了。它們?cè)僖换バ畔r(shí),只有通過進(jìn)程間通信來實(shí)現(xiàn),這將是我們下面的內(nèi)容。既然它們?nèi)绱讼嘞?,系統(tǒng)如何來區(qū)分它們呢?這是由函數(shù)的返回值來決定的。對(duì)于父進(jìn)程,fork函數(shù)返回了子程序的進(jìn)程號(hào),而對(duì)于子程序中興小靈通來電彩鈴,fork函數(shù)則返回零。在操作系統(tǒng)中,我們用ps函數(shù)就可以看到不同的進(jìn)程號(hào),對(duì)父進(jìn)程而言,它的進(jìn)程號(hào)是由比它更低層的系統(tǒng)調(diào)用賦予的,而對(duì)于子進(jìn)程而言,它的進(jìn)程號(hào)即是fork函數(shù)對(duì)父進(jìn)程的返回值。在程序設(shè)計(jì)中,父進(jìn)程和子進(jìn)程都要調(diào)用函數(shù)fork()下面的代碼nokia 7650 鈴聲,而我們就是利用fork()函數(shù)對(duì)父子進(jìn)程的不同返回值用if……else……語句來實(shí)現(xiàn)讓父子進(jìn)程完成不同的功能,正如我們上面舉的例子一樣。我們看到,上面例子執(zhí)行時(shí)兩條信息是交互無規(guī)則的打印出來的cect鈴聲下載,這是父子進(jìn)程獨(dú)立執(zhí)行的結(jié)果,雖然我們的代碼似乎和串行的代碼沒有什么區(qū)別。 讀者也許會(huì)問,如果一個(gè)大程序在運(yùn)行中,它的數(shù)據(jù)段和堆棧都很大,一次fork就要復(fù)制一次,那么fork的系統(tǒng)開銷不是很大嗎?其實(shí)UNIX自有其解決的辦法,大家知道,一般CPU都是以"頁"為單位來分配內(nèi)存空間的,每一個(gè)頁都是實(shí)際物理內(nèi)存的一個(gè)映像,象INTEL的CPU,其一頁在通常情況下是4086字節(jié)大小,而無論是數(shù)據(jù)段還是堆棧段都是由許多"頁"構(gòu)成的,fork函數(shù)復(fù)制這兩個(gè)段,只是"邏輯"上的,并非"物理"上的,也就是說,實(shí)際執(zhí)行fork時(shí),物理空間上兩個(gè)進(jìn)程的數(shù)據(jù)段和堆棧段都還是共享著的,當(dāng)有一個(gè)進(jìn)程寫了某個(gè)數(shù)據(jù)時(shí),這時(shí)兩個(gè)進(jìn)程之間的數(shù)據(jù)才有了區(qū)別,系統(tǒng)就將有區(qū)別的"頁"從物理上也分開。系統(tǒng)在空間上的開銷就可以達(dá)到最小。
   下面演示一個(gè)足以"搞死"Linux的小程序,其源代碼非常簡單:
  void main()
   {
     for( ; ; ) fork();
   }
  這個(gè)程序什么也不做,就是死循環(huán)地fork,其結(jié)果是程序不斷產(chǎn)生進(jìn)程,而這些進(jìn)程又不斷產(chǎn)生新的進(jìn)程,很快,系統(tǒng)的進(jìn)程就滿了,系統(tǒng)就被這么多不斷產(chǎn)生的進(jìn)程"撐死了"。當(dāng)然只要系統(tǒng)管理員預(yù)先給每個(gè)用戶設(shè)置可運(yùn)行的最大進(jìn)程數(shù),這個(gè)惡意的程序就完成不了企圖了。
   2.2.2 exec( )函數(shù)族
  下面我們來看看一個(gè)進(jìn)程如何來啟動(dòng)另一個(gè)程序的執(zhí)行。在Linux中要使用exec函數(shù)族。系統(tǒng)調(diào)用execve()對(duì)當(dāng)前進(jìn)程進(jìn)行替換,替換者為一個(gè)指定的程序,其參數(shù)包括文件名(filename)、參數(shù)列表(argv)以及環(huán)境變量(envp)。exec函數(shù)族當(dāng)然不止一個(gè),但它們大致相同,在Linux中,它們分別是:execl,execlp搞笑寶寶彩鈴,execle,execv,execve和execvp,下面我只以execlp為例,其它函數(shù)究竟與execlp有何區(qū)別,請(qǐng)通過manexec命令來了解它們的具體情況。
  一個(gè)進(jìn)程一旦調(diào)用exec類函數(shù),它本身就"死亡"了,系統(tǒng)把代碼段替換成新的程序的代碼,廢棄原有的數(shù)據(jù)段和堆棧段,并為新程序分配新的數(shù)據(jù)段與堆棧段,唯一留下的,就是進(jìn)程號(hào),也就是說,對(duì)系統(tǒng)而言,還是同一個(gè)進(jìn)程,不過已經(jīng)是另一個(gè)程序了。(不過exec類函數(shù)中有的還允許繼承環(huán)境變量之類的信息。)
  那么如果我的程序想啟動(dòng)另一程序的執(zhí)行但自己仍想繼續(xù)運(yùn)行的話,怎么辦呢?那就是結(jié)合fork與exec的使用。下面一段代碼顯示如何啟動(dòng)運(yùn)行其它程序:char command[256];
void main()
{
int rtn; /*子進(jìn)程的返回?cái)?shù)值*/
while(1) {
/* 從終端讀取要執(zhí)行的命令 */
printf( ">" );
fgets( command, 256, stdin );
command[strlen(command)-1] = 0;
if ( fork() == 0 ) {
/* 子進(jìn)程執(zhí)行此命令 */
execlp( command, command );
/* 如果exec函數(shù)返回,表明沒有正常執(zhí)行命令,打印錯(cuò)誤信息*/
perror( command );
exit( errorno );
}
else {
/* 父進(jìn)程, 等待子進(jìn)程結(jié)束,并打印子進(jìn)程的返回值 */
wait ( &rtn );
printf( " child process return %d ",. rtn );
}
}
}
  此程序從終端讀入命令并執(zhí)行之,執(zhí)行完成后,父進(jìn)程繼續(xù)等待從終端讀入命令。熟悉DOS和WINDOWS系統(tǒng)調(diào)用的朋友一定知道DOS/WINDOWS也有exec類函數(shù),其使用方法是類似的天津聯(lián)通鈴音下載,但DOS/WINDOWS還有spawn類函數(shù),因?yàn)镈OS是單任務(wù)的系統(tǒng),它只能將"父進(jìn)程"駐留在機(jī)器內(nèi)再執(zhí)行"子進(jìn)程",這就是spawn類的函數(shù)。WIN32已經(jīng)是多任務(wù)的系統(tǒng)了,但還保留了spawn類函數(shù),WIN32中實(shí)現(xiàn)spawn函數(shù)的方法同前述UNIX中的方法差不多,開設(shè)子進(jìn)程后父進(jìn)程等待子進(jìn)程結(jié)束后才繼續(xù)運(yùn)行。UNIX在其一開始就是多任務(wù)的系統(tǒng),所以從核心角度上講不需要spawn類函數(shù)。
  在這一節(jié)里,我們還要講講system()和popen()函數(shù)。system()函數(shù)先調(diào)用fork(),然后再調(diào)用exec()來執(zhí)行用戶的登錄shell,通過它來查找可執(zhí)行文件的命令并分析參數(shù),最后它么使用wait()函數(shù)族之一來等待子進(jìn)程的結(jié)束。函數(shù)popen()和函數(shù)system()相似,不同的是它調(diào)用pipe()函數(shù)創(chuàng)建一個(gè)管道,通過它來完成程序的標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出。這兩個(gè)函數(shù)是為那些不太勤快的程序員設(shè)計(jì)的,在效率和安全方面都有相當(dāng)?shù)娜毕荩诳赡艿那闆r下,應(yīng)該盡量避免。
Linux聯(lián)盟收集整理

http://www.allegations.com.cn/baidu/8003/982.htm

posted on 2007-12-18 15:41 閱讀(535) 評(píng)論(0)  編輯 收藏 引用 所屬分類: liunx編程技術(shù)

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美成人一品| 午夜精品久久久久久久蜜桃app| 久久精品在线免费观看| 亚洲欧美99| 亚洲欧美日韩成人高清在线一区| 亚洲一区二区三区三| 香蕉久久夜色精品国产| 久久精品国产久精国产思思| 久久婷婷久久| 欧美高清视频免费观看| 欧美午夜不卡影院在线观看完整版免费 | 狠狠色狠狠色综合日日tαg| 国产婷婷色一区二区三区| 伊人久久大香线蕉综合热线| 伊人男人综合视频网| 国产伦精品一区二区三区高清| 亚洲精品免费在线| 欧美激情精品久久久久久变态| 亚洲精品婷婷| 欧美在线亚洲综合一区| 欧美高清你懂得| 国产手机视频精品| 99精品视频免费观看视频| 久久精品免费看| 亚洲欧洲一级| 久久国产精品久久久久久| 欧美日韩国产成人在线91| 国产一区二区福利| 亚洲少妇在线| 久久九九国产精品怡红院| 亚洲精品一区二区三区蜜桃久| 久久精品欧美日韩| 国产精品成人在线观看| 亚洲第一精品在线| 午夜精品福利视频| 亚洲国产成人午夜在线一区| 羞羞答答国产精品www一本| 欧美日本不卡视频| 亚洲第一页自拍| 久久精品亚洲国产奇米99| 亚洲精品在线免费| 久热精品视频在线观看| 国产精品综合不卡av| 在线视频你懂得一区二区三区| 欧美激情四色| 久久久国产精品一区| 国产日韩综合| 亚洲永久精品大片| 亚洲美女视频在线观看| 欧美成人久久| 亚洲精选在线| 亚洲国产视频直播| 蜜桃精品久久久久久久免费影院| 国产在线高清精品| 久久久99精品免费观看不卡| 一本一本a久久| 欧美色精品在线视频| 亚洲老板91色精品久久| 亚洲国产精品成人综合| 欧美1区视频| 亚洲美女免费视频| 亚洲国产欧美日韩精品| 欧美精品一区二区三区蜜臀| 日韩午夜激情| 一区二区三区日韩欧美| 国产精品久久久久永久免费观看| 午夜一区不卡| 欧美一级片久久久久久久| 国产一区在线看| 男男成人高潮片免费网站| 久久午夜视频| 91久久精品一区二区三区| 亚洲国产高清视频| 欧美大成色www永久网站婷| 亚洲国产va精品久久久不卡综合| 欧美日韩国产一级片| 亚洲永久免费视频| 亚洲一区二区三区激情| 国产视频亚洲| 欧美成人四级电影| 欧美激情91| 亚洲欧美国产精品va在线观看| 亚洲午夜av在线| 一区二区三区自拍| 亚洲卡通欧美制服中文| 欧美午夜寂寞影院| 久久久夜夜夜| 欧美日韩国产在线播放| 久久超碰97人人做人人爱| 久久中文精品| 欧美伊人久久大香线蕉综合69| 蜜桃伊人久久| 久久激情一区| 欧美日韩精品二区| 久久一区二区三区超碰国产精品| 蜜臀va亚洲va欧美va天堂| aa国产精品| 久久久国产精品一区| 99视频+国产日韩欧美| 亚洲欧美国产不卡| 亚洲精选一区| 久久精品色图| 亚洲在线观看视频| 欧美中文字幕第一页| 亚洲视频网站在线观看| 久久久久久久网| 亚洲在线黄色| 欧美日韩亚洲91| 亚洲电影专区| 国内外成人在线| 在线一区亚洲| 亚洲日韩中文字幕在线播放| 欧美一级黄色网| 午夜精品国产精品大乳美女| 欧美精品日韩一区| 牛牛国产精品| 国产一区二区三区黄视频| 亚洲美女尤物影院| 亚洲国产欧美一区二区三区丁香婷| 亚洲视频专区在线| 99人久久精品视频最新地址| 欧美电影免费观看高清| 久久精品国产2020观看福利| 国产精品成人在线观看| 日韩一级黄色大片| 99riav国产精品| 欧美精品一区二区三区蜜臀| 欧美黄在线观看| 亚洲高清视频的网址| 久久精品成人欧美大片古装| 久久精品欧美日韩| 国产视频一区二区三区在线观看| 亚洲婷婷在线| 欧美一区二区在线免费观看| 国产精品永久入口久久久| 亚洲一区二区成人| 欧美一级久久| 国产日本欧洲亚洲| 欧美在线视频播放| 久久久久久高潮国产精品视| 国产午夜精品美女视频明星a级| 欧美午夜在线一二页| 免费在线观看一区二区| 亚洲综合色在线| 欧美一区二区三区喷汁尤物| 国产精品揄拍一区二区| 亚洲欧美日韩系列| 久久久久久久久久久一区| 一区在线免费| 免费观看成人www动漫视频| 亚洲电影一级黄| 在线一区二区三区四区五区| 欧美日韩视频| 亚洲欧美激情视频| 亚久久调教视频| 在线欧美日韩精品| 欧美日韩国内| 午夜宅男欧美| 欧美福利电影网| 亚洲婷婷免费| 好吊一区二区三区| 欧美成人免费全部观看天天性色| 亚洲区一区二区三区| 亚洲在线1234| 亚洲承认在线| 欧美视频在线播放| 亚洲男人的天堂在线观看 | 久久久青草婷婷精品综合日韩| 韩国av一区二区三区在线观看| 久久亚洲图片| 国产精品99久久久久久人 | 99re这里只有精品6| 国产精品视频精品视频| 久久亚洲一区二区三区四区| 妖精成人www高清在线观看| 久久久久久一区| 99在线视频精品| 国产亚洲在线观看| 欧美日韩精品一二三区| 欧美一区二区在线视频| 亚洲精品自在在线观看| 久久久一本精品99久久精品66| 日韩午夜激情电影| 极品少妇一区二区三区| 欧美日本在线播放| 久久精品亚洲国产奇米99| 亚洲精品孕妇| 欧美华人在线视频| 久久久久成人精品免费播放动漫| 一区二区三区视频在线观看| 亚洲国产色一区| 在线日韩欧美| 伊人久久综合| 精品二区视频| 激情成人中文字幕| 国产色综合久久| 国产日韩精品一区二区三区在线 | 欧美午夜不卡视频| 欧美岛国激情| 欧美a级大片|