當前位置:首頁 » 編程軟體 » 多進程編程

多進程編程

發布時間: 2022-01-10 23:50:21

A. 如何使用python實現多進程編程

1.Process
創建進程的類:Process([group[,target[,name[,args[,kwargs]]]]]),target表示調用對象,args表示調用對象的位置參數元組。kwargs表示調用對象的字典。name為別名。group實質上不使用。
方法:is_alive()、join([timeout])、run()、start()、terminate()。其中,Process以start()啟動某個進程。
屬性:authkey、daemon(要通過start()設置)、exitcode(進程在運行時為None、如果為–N,表示被信號N結束)、name、pid。其中daemon是父進程終止後自動終止,且自己不能產生新進程,必須在start()之前設置。

例1.1:創建函數並將其作為單個進程
importmultiprocessing
importtime

defworker(interval):
n=5
whilen>0:
print("Thetimeis{0}".format(time.ctime()))
time.sleep(interval)
n-=1

if__name__=="__main__":
p=multiprocessing.Process(target=worker,args=(3,))
p.start()
print"p.pid:",p.pid
print"p.name:",p.name
print"p.is_alive:",p.is_alive()
結果
12345678p.pid:8736p.name:Process-1p.is_alive:TrueThetimeisTueApr2120:55:122015ThetimeisTueApr2120:55:152015ThetimeisTueApr2120:55:182015ThetimeisTueApr2120:55:212015ThetimeisTueApr2120:55:242015

例1.2:創建函數並將其作為多個進程
importmultiprocessing
importtime

defworker_1(interval):
print"worker_1"
time.sleep(interval)
print"endworker_1"

defworker_2(interval):
print"worker_2"
time.sleep(interval)
print"endworker_2"

defworker_3(interval):
print"worker_3"
time.sleep(interval)
print"endworker_3"

if__name__=="__main__":
p1=multiprocessing.Process(target=worker_1,args=(2,))
p2=multiprocessing.Process(target=worker_2,args=(3,))
p3=multiprocessing.Process(target=worker_3,args=(4,))

p1.start()
p2.start()
p3.start()

print("ThenumberofCPUis:"+str(multiprocessing.cpu_count()))
forpinmultiprocessing.active_children():
print("childp.name:"+p.name+" p.id"+str(p.pid))
print"END!!!!!!!!!!!!!!!!!"
結果
1234567891011ThenumberofCPUis:4childp.name:Process-3p.id7992childp.name:Process-2p.id4204childp.name:Process-1p.id6380END!!!!!!!!!!!!!!!!!worker_1worker_3worker_2endworker_1endworker_2endworker_3

例1.3:將進程定義為類
importmultiprocessing
importtime

classClockProcess(multiprocessing.Process):
def__init__(self,interval):
multiprocessing.Process.__init__(self)
self.interval=interval

defrun(self):
n=5
whilen>0:
print("thetimeis{0}".format(time.ctime()))
time.sleep(self.interval)
n-=1

if__name__=='__main__':
p=ClockProcess(3)
p.start()
註:進程p調用start()時,自動調用run()
結果
12345thetimeisTueApr2120:31:302015thetimeisTueApr2120:31:332015thetimeisTueApr2120:31:362015thetimeisTueApr2120:31:392015thetimeisTueApr2120:31:422015

B. c語言多進程編程

多進程這個詞用得比較少,聽過來有點不熟悉。你這個程序在linux下應該很容易實行,就是個進程間通信的問題,管道、消息隊列、共享內存都可以,可以找找相關資料。昨天失言不好意思。
三個源文件分別為1.c、2.c、3.c一個頭文件share.h。
share.h:
//共享的內存,兩個數組
typedef struct{
int a[2];
int b[2];
int id;
}share_use;

1.c:
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>

#include"share.h"

int main(){
void *shared_memory = (void *)0;
share_use *share_stuff;
int shmid;

shmid=shmget((key_t)1234,sizeof(share_use),0666|IPC_CREAT);//創建共享內存
if(shmid==-1){
fprintf(stderr,"共享內存創建失敗!\n");
exit(1);
}

shared_memory = shmat(shmid, (void *)0,0);//讓進程可以訪問共享內存
if(shared_memory == (void *)-1){
fprintf(stderr,"啟用共享內存失敗!\n)";
exit(1);
}
printf("Memory attached at %X\n",(int)shared_memory);

share_stuff = (share_use *)shared_memory;
share_stuff->id=0;
share_stuff->a[0]=1;
share_stuff->a[1]=2;
while(1){
if(share_stuff->id)
exit(0);
sleep(10);
}
}

2.c:
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>

#include"share.h"

int main(){
void *shared_memory = (void *)0;
share_use *share_stuff;
int shmid;

shmid=shmget((key_t)1234,sizeof(share_use),0666|IPC_CREAT);//創建共享內存
if(shmid==-1){
fprintf(stderr,"共享內存創建失敗!\n");
exit(1);
}

shared_memory = shmat(shmid, (void *)0,0);//讓進程可以訪問共享內存
if(shared_memory == (void *)-1){
fprintf(stderr,"啟用共享內存失敗!\n");
exit(1);
}
printf("Memory attached at %X\n",(int)shared_memory);

share_stuff = (share_use *)shared_memory;
share_stuff->b[0]=share_stuff->a[0]*100;
share_stuff->b[1]=share_stuff->a[1]*100;
while(1)
{
if(share_stuff->id)
exit(0);
sleep(10);
}
}
3.c:
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>

#include"share.h"

int main(){
void *shared_memory = (void *)0;
share_use *share_stuff;
int shmid;

shmid=shmget((key_t)1234,sizeof(share_use),0666|IPC_CREAT);//創建共享內存
if(shmid==-1){
fprintf(stderr,"共享內存創建失敗!\n");
exit(1);
}

shared_memory = shmat(shmid, (void *)0,0);//讓進程可以訪問共享內存
if(shared_memory == (void *)-1){
fprintf(stderr,"啟用共享內存失敗!\n");
exit(1);
}
printf("Memory attached at %X\n",(int)shared_memory);

share_stuff = (share_use *)shared_memory;
printf("共享內存中有元素:%d , %d",share_stuff->b[0],share_stuff->b[1]);
share_stuff->id=1;
return 0;
}
linux或unix環境下編譯

C. 單進程編程與多進程編程最大的區別是什麼

單進程編程:順序執行
多進程編程:同時執行

單進程編程:數據同步
多進程編程:數據非同步

單進程編程:復雜度低
多進程編程:復雜度高

單進程編程:用途單一
多進程編程:用途廣泛

D. 編了下LINUX多進程編程,遇到了個無法理解的問題,求大神解答

  • 有可能是Makefile有問題的哦。檢查下吧。用的頭文件都是內核的頭文件。

E. 求助:linux多進程編程淺析畢業論文怎麼寫

linux多進程編程淺析畢業論文的寫作格式、流程與寫作技巧 廣義來說,凡屬論述科學技術內容的作品,都稱作科學著述,如原始論著(論文)、簡報、綜合報告、進展報告、文獻綜述、述評、專著、匯編、教科書和科普讀物等。但其中只有原始論著及其簡報是原始的、主要的、第一性的、涉及到創造發明等知識產權的。其它的當然也很重要,但都是加工的、發展的、為特定應用目的和對象而撰寫的。下面僅就論文的撰寫談一些體會。在討論論文寫作時也不準備談有關稿件撰寫的各種規定及細則。主要談的是論文寫作中容易發生的問題和經驗,是論文寫作道德和書寫內容的規范問題。 論文寫作的要求 下面按論文的結構順序依次敘述。 (一)論文——題目科學論文都有題目,不能「無題」。論文題目一般20字左右。題目大小應與內容符合,盡量不設副題,不用第1報、第2報之類。論文題目都用直敘口氣,不用驚嘆號或問號,也不能將科學論文題目寫成廣告語或新聞報道用語。 (二)論文——署名科學論文應該署真名和真實的工作單位。主要體現責任、成果歸屬並便於後人追蹤研究。嚴格意義上的論文作者是指對選題、論證、查閱文獻、方案設計、建立方法、實驗操作、整理資料、歸納總結、撰寫成文等全過程負責的人,應該是能解答論文的有關問題者。現在往往把參加工作的人全部列上,那就應該以貢獻大小依次排列。論文署名應徵得本人同意。學術指導人根據實際情況既可以列為論文作者,也可以一般致謝。行政領導人一般不署名。 (三)論文——引言 是論文引人入勝之言,很重要,要寫好。一段好的論文引言常能使讀者明白你這份工作的發展歷程和在這一研究方向中的位置。要寫出論文立題依據、基礎、背景、研究目的。要復習必要的文獻、寫明問題的發展。文字要簡練。 (四)論文——材料和方法 按規定如實寫出實驗對象、器材、動物和試劑及其規格,寫出實驗方法、指標、判斷標准等,寫出實驗設計、分組、統計方法等。這些按雜志 對論文投稿規定辦即可。 (五)論文——實驗結果 應高度歸納,精心分析,合乎邏輯地鋪述。應該去粗取精,去偽存真,但不能因不符合自己的意圖而主觀取捨,更不能弄虛作假。只有在技術不熟練或儀器不穩定時期所得的數據、在技術故障或操作錯誤時所得的數據和不符合實驗條件時所得的數據才能廢棄不用。而且必須在發現問題當時就在原始記錄上註明原因,不能在總結處理時因不合常態而任意剔除。廢棄這類數據時應將在同樣條件下、同一時期的實驗數據一並廢棄,不能只廢棄不合己意者。 實驗結果的整理應緊扣主題,刪繁就簡,有些數據不一定適合於這一篇論文,可留作它用,不要硬行拼湊到一篇論文中。論文行文應盡量採用專業術語。能用表的不要用圖,可以不用圖表的最好不要用圖表,以免多佔篇幅,增加排版困難。文、表、圖互不重復。實驗中的偶然現象和意外變故等特殊情況應作必要的交代,不要隨意丟棄。 (六)論文——討論 是論文中比較重要,也是比較難寫的一部分。應統觀全局,抓住主要的有爭議問題,從感性認識提高到理性認識進行論說。要對實驗結果作出分析、推理,而不要重復敘述實驗結果。應著重對國內外相關文獻中的結果與觀點作出討論,表明自己的觀點,尤其不應迴避相對立的觀點。 論文的討論中可以提出假設,提出本題的發展設想,但分寸應該恰當,不能寫成「科幻」或「暢想」。 (七)論文——結語或結論 論文的結語應寫出明確可靠的結果,寫出確鑿的結論。論文的文字應簡潔,可逐條寫出。不要用「小結」之類含糊其辭的詞。 (八)論文——參考義獻 這是論文中很重要、也是存在問題較多的一部分。列出論文參考文獻的目的是讓讀者了解論文研究命題的來龍去脈,便於查找,同時也是尊重前人勞動,對自己的工作有準確的定位。因此這里既有技術問題,也有科學道德問題。 一篇論文中幾乎自始至終都有需要引用參考文獻之處。如論文引言中應引上對本題最重要、最直接有關的文獻;在方法中應引上所採用或借鑒的方法;在結果中有時要引上與文獻對比的資料;在討論中更應引上與 論文有關的各種支持的或有矛盾的結果或觀點等。 一切粗心大意,不查文獻;故意不引,自鳴創新;貶低別人,抬高自己;避重就輕,故作姿態的做法都是錯誤的。而這種現象現在在很多論文中還是時有所見的,這應該看成是利研工作者的大忌。其中,不查文獻、漏掉重要文獻、故意不引別人文獻或有意貶損別人工作等錯誤是比較明顯、容易發現的。有些做法則比較隱蔽,如將該引在引言中的,把它引到討論中。這就將原本是你論文的基礎或先導,放到和你論文平起平坐的位置。又如 科研工作總是逐漸深人發展的,你的工作總是在前人工作基石出上發展起來做成的。正確的寫法應是,某年某人對本題做出了什麼結果,某年某人在這基礎上又做出了什麼結果,現在我在他們基礎上完成了這一研究。這是實事求是的態度,這樣表述絲毫無損於你的貢獻。有些論文作者卻不這樣表述,而是說,某年某人做過本題沒有做成,某年某人又做過本題仍沒有做成,現在我做成了。這就不是實事求是的態度。這樣有時可以糊弄一些不明真相的外行人,但只需內行人一戳,紙老虎就破,結果弄巧成拙,喪失信譽。這種現象在現實生活中還是不少見的。 (九)論文——致謝 論文的指導者、技術協助者、提供特殊試劑或器材者、經費資助者和提出過重要建議者都屬於致謝對象。論文致謝應該是真誠的、實在的,不要庸俗化。不要泛泛地致謝、不要只謝教授不謝旁人。寫論文致謝前應徵得被致謝者的同意,不能拉大旗作虎皮。 (十)論文——摘要或提要:以200字左右簡要地概括論文全文。常放篇首。論文摘要需精心撰寫,有吸引力。要讓讀者看了論文摘要就像看到了論文的縮影,或者看了論文摘要就想繼續看論文的有關部分。此外,還應給出幾個關鍵詞,關鍵詞應寫出真正關鍵的學術詞彙,不要硬湊一般性用詞。 推薦一些比較好的論文網站。 論文之家 http://www.91qikan.com 優秀論文雜志 http://www.interpapers.com/kj/ 論文資料網 http://www.51paper.net/ 法律圖書館 http://www.law-lib.com/ 法學論文資料庫 http://www.law-lib.com/lw/ 中國總經理網論文集 http://www.cnceo.com/school/lwj.asp mba職業經理人論壇 http://mba.001.com.cn/mbamba.htm 財經學位論文下載中心 http://www.forumcn.com/sblw/ 公開發表論文_深圳證券交易所 http://www.sse.org.cn/sse/yjkw/gkfblw.asp 中國路橋資訊網論文資料中心 http://www.lqzx.com/lunwen.htm 論文商務中心 http://doc.cei.gov.cn/ 法律帝國: http://www.fl365.com/gb/lawthinker/bbs/default.asp 學術論文 http://www.hrexam.com/advanced1.htm 論文統計 http://www.sci.com.cn/ 北京大學學位論文樣本收藏 http://www.lib.pku.e.cn/xwlw.html 學位論文 (清華大學) http://www.lib.tsinghua.e.cn/new/thesis.html 中國科技論文在線 http://www.paper.e.cn/ 論文中國 : http://www.chinawrite.com/ 新浪論文網分類: http://dir.sina.com.cn/search_dir/jy/lw/ 中國論文聯盟: http://www.lwlm.com/ 大學生論文庫 http://www.syiae.com/lunwen 論文資料網: http://www.51paper.net/

F. 在多進程編程中,用系統調用___來創建新進程,該函數在__中返回值為0,在__中返回值為大於0的進程號,

OpenProcessToken 要對一個任意進程(包括系統安全進程和服務進程)進行指定了寫相關的訪問權的OpenProcess操作,只要當前進程具有SeDeDebug許可權就可以了。要是一個用戶是Administrator或是被給予了相應的許可權,就可以具有該許可權。可是,就算我們用Administrator帳號對一個系統安全進程執行OpenProcess(PROCESS_ALL_ACCESS,FALSE, dwProcessID)還是會遇到「訪問拒絕」的錯誤。什麼原因呢?原來在默認的情況下進程的一些訪問許可權是沒有被啟用(Enabled)的,所以我們要做的首先是啟用這些許可權。與此相關的一些API函數有OpenProcessToken、LookupPrivilegevalue、AdjustTokenPrivileges。 可以看一下這里。。 ke/view/1304692.htm

G. C# .net 多進程編程的例子

Thread t1 = null;
Thread t2 = null;
private void Form1_Load(object sender, EventArgs e)
{
t1 = new Thread(new ThreadStart(T1));
t1.Start();
t2 = new Thread(new ThreadStart(T2));
t2.Start();
}

private void button1_Click(object sender, EventArgs e)
{
if (t1.ThreadState == ThreadState.Aborted||t1.ThreadState==ThreadState.Stopped)
{
MessageBox.Show("線程1結束了");
t1.Abort();
}
if (t2.ThreadState == ThreadState.Aborted||t1.ThreadState==ThreadState.Stopped)
{
MessageBox.Show("線程2結束了");
t2.Abort();
}
}
private void T1()
{
MessageBox.Show("進程1");

}
private void T2()
{
MessageBox.Show("進程2");

}

H. linux多進程編程 看什麼書

最近在學習linux環境高級編程,多進程編程算是編程中的最重要的一個部分了,本文讓我學習和明白了很多,所以轉載過來。讓更多想多線程編程的人學習。只有頂到首頁才能讓更多的人學習。
文章摘要:
多線程程序設計的概念早在六十年代就被提出,但直到八十年代中期,Unix系統中才引入多線程機制,如今,由於自身的許多優點,多線程編程已經得到了廣泛的應用。本文我們將介紹在Linux下編寫多進程和多線程程序的一些初步知識。

--------------------------------------------------------------------------------

正文:
Linux下的多進程編程初步

1 引言
對於沒有接觸過Unix/Linux操作系統的人來說,fork是最難理解的概念之一:它執行一次卻返回兩個值。fork函數是Unix系統最傑出的成就之一,它是七十年代UNIX早期的開發者經過長期在理論和實踐上的艱苦探索後取得的成果,一方面,它使操作系統在進程管理上付出了最小的代價,另一方面,又為程序員提供了一個簡潔明了的多進程方法。與DOS和早期的Windows不同,Unix/Linux系統是真正實現多任務操作的系統,可以說,不使用多進程編程,就不能算是真正的Linux環境下編程。
多線程程序設計的概念早在六十年代就被提出,但直到八十年代中期,Unix系統中才引入多線程機制,如今,由於自身的許多優點,多線程編程已經得到了廣泛的應用。
下面,我們將介紹在Linux下編寫多進程和多線程程序的一些初步知識。

2 多進程編程
什麼是一個進程?進程這個概念是針對系統而不是針對用戶的,對用戶來說,他面對的概念是程序。當用戶敲入命令執行一個程序的時候,對系統而言,它將啟動一個進程。但和程序不同的是,在這個進程中,系統可能需要再啟動一個或多個進程來完成獨立的多個任務。多進程編程的主要內容包括進程式控制制和進程間通信,在了解這些之前,我們先要簡單知道進程的結構。

2.1 Linux下進程的結構
Linux下一個進程在內存里有三部分的數據,就是"代碼段"、"堆棧段"和"數據段"。其實學過匯編語言的人一定知道,一般的CPU都有上述三種段寄存器,以方便操作系統的運行。這三個部分也是構成一個完整的執行序列的必要的部分。
"代碼段",顧名思義,就是存放了程序代碼的數據,假如機器中有數個進程運行相同的一個程序,那麼它們就可以使用相同的代碼段。"堆棧段"存放的就是子程序的返回地址、子程序的參數以及程序的局部變數。而數據段則存放程序的全局變數,常數以及動態數據分配的數據空間(比如用malloc之類的函數取得的空間)。這其中有許多細節問題,這里限於篇幅就不多介紹了。系統如果同時運行數個相同的程序,它們之間就不能使用同一個堆棧段和數據段。

2.2 Linux下的進程式控制制
在傳統的Unix環境下,有兩個基本的操作用於創建和修改進程:函數fork( )用來創建一個新的進程,該進程幾乎是當前進程的一個完全拷貝;函數族exec( )用來啟動另外的進程以取代當前運行的進程。Linux的進程式控制制和傳統的Unix進程式控制制基本一致,只在一些細節的地方有些區別,例如在Linux系統中調用vfork和fork完全相同,而在有些版本的Unix系統中,vfork調用有不同的功能。由於這些差別幾乎不影響我們大多數的編程,在這里我們不予考慮。
2.2.1 fork( )
fork在英文中是"分叉"的意思。為什麼取這個名字呢?因為一個進程在運行中,如果使用了fork,就產生了另一個進程,於是進程就"分叉"了,所以這個名字取得很形象。下面就看看如何具體使用fork,這段程序演示了使用fork的基本框架:

void main(){
int i;
if ( fork() == 0 ) {
/* 子進程程序 */
for ( i = 1; i <1000; i ++ ) printf("This is child process/n");
}
else {
/* 父進程程序*/
for ( i = 1; i <1000; i ++ ) printf("This is process process/n");
}
}

程序運行後,你就能看到屏幕上交替出現子進程與父進程各列印出的一千條信息了。如果程序還在運行中,你用ps命令就能看到系統中有兩個它在運行了。
那麼調用這個fork函數時發生了什麼呢?fork函數啟動一個新的進程,前面我們說過,這個進程幾乎是當前進程的一個拷貝:子進程和父進程使用相同的代碼段;子進程復制父進程的堆棧段和數據段。這樣,父進程的所有數據都可以留給子進程,但是,子進程一旦開始運行,雖然它繼承了父進程的一切數據,但實際上數據卻已經分開,相互之間不再有影響了,也就是說,它們之間不再共享任何數據了。它們再要交互信息時,只有通過進程間通信來實現,這將是我們下面的內容。既然它們如此相象,系統如何來區分它們呢?這是由函數的返回值來決定的。對於父進程,fork函數返回了子程序的進程號,而對於子程序,fork函數則返回零。在操作系統中,我們用ps函數就可以看到不同的進程號,對父進程而言,它的進程號是由比它更低層的系統調用賦予的,而對於子進程而言,它的進程號即是fork函數對父進程的返回值。在程序設計中,父進程和子進程都要調用函數fork()下面的代碼,而我們就是利用fork()函數對父子進程的不同返回值用if...else...語句來實現讓父子進程完成不同的功能,正如我們上面舉的例子一樣。我們看到,上面例子執行時兩條信息是交互無規則的列印出來的,這是父子進程獨立執行的結果,雖然我們的代碼似乎和串列的代碼沒有什麼區別。
讀者也許會問,如果一個大程序在運行中,它的數據段和堆棧都很大,一次fork就要復制一次,那麼fork的系統開銷不是很大嗎?其實UNIX自有其解決的辦法,大家知道,一般CPU都是以"頁"為單位來分配內存空間的,每一個頁都是實際物理內存的一個映像,象INTEL的CPU,其一頁在通常情況下是4086位元組大小,而無論是數據段還是堆棧段都是由許多"頁"構成的,fork函數復制這兩個段,只是"邏輯"上的,並非"物理"上的,也就是說,實際執行fork時,物理空間上兩個進程的數據段和堆棧段都還是共享著的,當有一個進程寫了某個數據時,這時兩個進程之間的數據才有了區別,系統就將有區別的"頁"從物理上也分開。系統在空間上的開銷就可以達到最小。
下面演示一個足以"搞死"Linux的小程序,其源代碼非常簡單:


void main()
{
for( ; ; ) fork();
}

這個程序什麼也不做,就是死循環地fork,其結果是程序不斷產生進程,而這些進程又不斷產生新的進程,很快,系統的進程就滿了,系統就被這么多不斷產生的進程"撐死了"。當然只要系統管理員預先給每個用戶設置可運行的最大進程數,這個惡意的程序就完成不了企圖了。
2.2.2 exec( )函數族
下面我們來看看一個進程如何來啟動另一個程序的執行。在Linux中要使用exec函數族。系統調用execve()對當前進程進行替換,替換者為一個指定的程序,其參數包括文件名(filename)、參數列表(argv)以及環境變數(envp)。exec函數族當然不止一個,但它們大致相同,在Linux中,它們分別是:execl,execlp,execle,execv,execve和execvp,下面我只以execlp為例,其它函數究竟與execlp有何區別,請通過manexec命令來了解它們的具體情況。
一個進程一旦調用exec類函數,它本身就"死亡"了,系統把代碼段替換成新的程序的代碼,廢棄原有的數據段和堆棧段,並為新程序分配新的數據段與堆棧段,唯一留下的,就是進程號,也就是說,對系統而言,還是同一個進程,不過已經是另一個程序了。(不過exec類函數中有的還允許繼承環境變數之類的信息。)
那麼如果我的程序想啟動另一程序的執行但自己仍想繼續運行的話,怎麼辦呢?那就是結合fork與exec的使用。下面一段代碼顯示如何啟動運行其它程序:

char command[256];
void main()
{
int rtn; /*子進程的返回數值*/
while(1) {
/* 從終端讀取要執行的命令 */
printf( ">" );
fgets( command, 256, stdin );
command[strlen(command)-1] = 0;
if ( fork() == 0 ) {
/* 子進程執行此命令 */
execlp( command, command );
/* 如果exec函數返回,表明沒有正常執行命令,列印錯誤信息*/
perror( command );
exit( errorno );
}
else {
/* 父進程, 等待子進程結束,並列印子進程的返回值 */
wait ( &rtn );
printf( " child process return %d/n",. rtn );
}
}
}此程序從終端讀入命令並執行之,執行完成後,父進程繼續等待從終端讀入命令。熟悉DOS和WINDOWS系統調用的朋友一定知道DOS/WINDOWS也有exec類函數,其使用方法是類似的,但DOS/WINDOWS還有spawn類函數,因為DOS是單任務的系統,它只能將"父進程"駐留在機器內再執行"子進程",這就是spawn類的函數。WIN32已經是多任務的系統了,但還保留了spawn類函數,WIN32中實現spawn函數的方法同前述UNIX中的方法差不多,開設子進程後父進程等待子進程結束後才繼續運行。UNIX在其一開始就是多任務的系統,所以從核心角度上講不需要spawn類函數。
在這一節里,我們還要講講system()和popen()函數。system()函數先調用fork(),然後再調用exec()來執行用戶的登錄shell,通過它來查找可執行文件的命令並分析參數,最後它么使用wait()函數族之一來等待子進程的結束。函數popen()和函數system()相似,不同的是它調用pipe()函數創建一個管道,通過它來完成程序的標准輸入和標准輸出。這兩個函數是為那些不太勤快的程序員設計的,在效率和安全方面都有相當的缺陷,在可能的情況下,應該盡量避免。

I. 多進程編程 相對於 多線程編程的優勢在哪 誰能給解釋一下, 謝謝了

1. 多進程的優勢在於任務的獨立性,比如某個任務單獨作為一個進程的話,崩潰隻影響自己的服務,其他任務不受影響.如果是多個任務在同一個進程內部利用多個線程進行處理,某個線程發生了未處理的異常的話,會導致整個進程完蛋,所有的任務跟著遭殃.
2. 從資源分配上來說,多進程方案比多線程方案更加靈活和自由.
3. 不過任務間的通信方面多進程要比多線程復雜些,編一個好的多進程通信方案要比多線程間的通信方案困難多了.
-------------------------
以web server為例的話,比如我的伺服器上架設了三個網站,如果是用一個進程管理的話, 網站A遭受攻擊死掉了,意味著另外兩個網站會出現同樣的現象. 如果是分開獨立的進程的話,三個網站互不影響.

熱點內容
linux是免費的嗎 發布:2024-11-15 15:53:44 瀏覽:616
多控存儲 發布:2024-11-15 15:52:42 瀏覽:282
一年級數學分解演算法 發布:2024-11-15 15:41:08 瀏覽:410
安卓個人熱點怎麼分享 發布:2024-11-15 15:40:16 瀏覽:263
墊錢解壓 發布:2024-11-15 15:38:54 瀏覽:335
miui4相當於安卓什麼系統 發布:2024-11-15 15:37:54 瀏覽:708
rc4android 發布:2024-11-15 15:27:25 瀏覽:741
電腦伺服器機箱圖片 發布:2024-11-15 15:27:18 瀏覽:114
網頁緩存文件提取 發布:2024-11-15 15:24:42 瀏覽:144
sqlserver提高 發布:2024-11-15 15:24:40 瀏覽:659