進程間通信方式比較_第1頁
進程間通信方式比較_第2頁
進程間通信方式比較_第3頁
進程間通信方式比較_第4頁
進程間通信方式比較_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、進程間的通信方式:   1.管道(pipe)及有名管道(named pipe):     管道可用于具有親緣關(guān)系進程間的通信,有名管道除了具有管道所具有的功能外,它還允許無親緣關(guān)系進程間的通信。 2.信號(signal):     信號是在軟件層次上對中斷機制的一種模擬,它是比較復雜的通信方式,用于通知進程有某事件發(fā)生,一個進程收到一個信號與處理器收到一個中斷請求效果上可以說是一致得。    3.消息隊列(messa

2、ge queue):     消息隊列是消息的鏈接表,它克服了上兩種通信方式中信號量有限的缺點,具有寫權(quán)限得進程可以按照一定得規(guī)則向消息隊列中添加新信息;對消息隊列有讀權(quán)限得進程則可以從消息隊列中讀取信息。             消息緩沖通信技術(shù)是由Hansen首先提出的,其基本思想是:根據(jù)”生產(chǎn)者-消費者”原理,利用內(nèi)存中公用消息緩沖區(qū)實現(xiàn)進程之間的信息交換.        

3、;           內(nèi)存中開辟了若干消息緩沖區(qū),用以存放消息.每當一個進程向另一個進程發(fā)送消息時,便申請一個消息緩沖區(qū),并把已準備好的消息送到緩沖區(qū),然后把該消息緩沖區(qū)插入到接收進程的消息隊列中,最后通知接收進程.接收進程收到發(fā)送里程發(fā)來的通知后,從本進程的消息隊列中摘下一消息緩沖區(qū),取出所需的信息,然后把消息緩沖區(qū)不定期給系統(tǒng).系統(tǒng)負責管理公用消息緩沖區(qū)以及消息的傳遞.                   一個進程可以給若干個進程發(fā)送消息,

4、反之,一個進程可以接收不同進程發(fā)來的消息.顯然,進程中關(guān)于消息隊列的操作是臨界區(qū).當發(fā)送進程正往接收進程的消息隊列中添加一條消息時,接收進程不能同時從該消息隊列中到出消息:反之也一樣.       消息緩沖區(qū)通信機制包含以下列內(nèi)容:       (1)           消息緩沖區(qū),這是一個由以下幾項組成的數(shù)據(jù)結(jié)構(gòu):    1、       消息長度    2、     &#

5、160; 消息正文    3、       發(fā)送者    4、       消息隊列指針       (2)消息隊列首指針m-q,一般保存在PCB中。    (1)   互斥信號量m-mutex,初值為1,用于互斥訪問消息隊列,在PCB中設(shè)置。    (2)   同步信號量m-syn,初值為0,用于消息計數(shù),在PCB中設(shè)置。    (3)   發(fā)送消息原語send &

6、#160;  (4)   接收消息原語receive(a)      4.共享內(nèi)存(shared memory):     可以說這是最有用的進程間通信方式。它使得多個進程可以訪問同一塊內(nèi)存空間,不同進程可以及時看到對方進程中對共享內(nèi)存中數(shù)據(jù)得更新。這種方式需要依靠某種同步操作,如互斥鎖和信號量等。  這種通信模式需要解決兩個問題:第一個問題是怎樣提供共享內(nèi)存;第二個是公共內(nèi)存的互斥關(guān)系則是程序開發(fā)人員的責任。    

7、;  5.信號量(semaphore):     主要作為進程之間及同一種進程的不同線程之間得同步和互斥手段。    6.套接字(socket);     這是一種更為一般得進程間通信機制,它可用于網(wǎng)絡(luò)中不同機器之間的進程間通信,應(yīng)用非常廣泛。 linux下的進程間通信-詳解詳細的講述進程間通信在這里絕對是不可能的事情,而且筆者很難有信心說自己對這一部分內(nèi)容的認識達到了什么樣的地步,所以在這一節(jié)的開頭首先向大家推薦著 名作者R

8、ichard Stevens的著名作品:Advanced Programming in the UNIX Environment,它的中文譯本UNIX環(huán)境高級編程已有機械工業(yè)出版社出版,原文精彩,譯文同樣地道,如果你的確對在Linux下編程有濃 厚的興趣,那么趕緊將這本書擺到你的書桌上或計算機旁邊來。說這么多實在是難抑心中的景仰之情,言歸正傳,在這一節(jié)里,我們將介紹進程間通信最最初步和最 最簡單的一些知識和概念。  首先,進程間通信至少可以通過傳送打開文件來實現(xiàn),不同的進程通過一個或多個文件來傳遞信息,事實上,在很多應(yīng)用系統(tǒng)里,都使用了這種方法。但一般說來, 進程間通信(IPC:In

9、terProcess Communication)不包括這種似乎比較低級的通信方法。Unix系統(tǒng)中實現(xiàn)進程間通信的方法很多,而且不幸的是,極少方法能在所有的Unix系 統(tǒng)中進行移植(唯一一種是半雙工的管道,這也是最原始的一種通信方式)。而Linux作為一種新興的操作系統(tǒng),幾乎支持所有的Unix下常用的進程間通信 方法:管道、消息隊列、共享內(nèi)存、信號量、套接口等等。下面我們將逐一介紹。  2.3.1 管道  管道是進程間通信中最古老的方式,它包括無名管道和有名管道兩種,前者用于父進程和子進程間的通信,后者用于運行于同一臺機器上的任意兩個進程間的通信。  無名管道由p

10、ipe()函數(shù)創(chuàng)建:  #include <unistd.h>  int pipe(int filedis2);  參數(shù)filedis返回兩個文件描述符:filedes0為讀而打開,filedes1為寫而打開。filedes1的輸出是filedes0的輸入。下面的例子示范了如何在父進程和子進程間實現(xiàn)通信。 #define INPUT 0 #define OUTPUT 1 void main()  int file_descriptors2; /*定義子進程號 */ pid_t pid;

11、0;char buf256; int returned_count; /*創(chuàng)建無名管道*/ pipe(file_descriptors); /*創(chuàng)建子進程*/ if(pid = fork() = -1)  printf("Error in forkn"); exit(1);  /*執(zhí)行子進程*/ if(pid = 0)  printf("in the spawned (child) process.n"); /*子進程向父進程寫數(shù)據(jù),關(guān)

12、閉管道的讀端*/ close(file_descriptorsINPUT); write(file_descriptorsOUTPUT, "test data", strlen("test data"); exit(0);  else  /*執(zhí)行父進程*/ printf("in the spawning (parent) process.n"); /*父進程從管道讀取子進程寫的數(shù)據(jù),關(guān)閉管道的寫端*/ close(file_descriptorsOUTPU

13、T); returned_count = read(file_descriptorsINPUT, buf, sizeof(buf); printf("%d bytes of data received from spawned process: %sn", returned_count, buf);    在Linux系統(tǒng)下,有名管道可由兩種方式創(chuàng)建:命令行方式mknod系統(tǒng)調(diào)用和函數(shù)mkfifo。下面的兩種途徑都在當前目錄下生成了一個名為myfifo的有名管道:  方式一:mkfifo("my

14、fifo","rw");  方式二:mknod myfifo p  生成了有名管道后,就可以使用一般的文件I/O函數(shù)如open、close、read、write等來對它進行操作。下面即是一個簡單的例子,假設(shè)我們已經(jīng)創(chuàng)建了一個名為myfifo的有名管道。  /* 進程一:讀有名管道*/ #include <stdio.h> #include <unistd.h> void main()  FILE * in_file; int count = 1;

15、60;char buf80; in_file = fopen("mypipe", "r"); if (in_file = NULL)  printf("Error in fdopen.n"); exit(1);  while (count = fread(buf, 1, 80, in_file) > 0) printf("received from pipe: %sn", buf); fclose(in_file); &

16、#160; /* 進程二:寫有名管道*/ #include <stdio.h> #include <unistd.h> void main()  FILE * out_file; int count = 1; char buf80; out_file = fopen("mypipe", "w"); if (out_file = NULL)  printf("Error opening pipe."); exit(

17、1);  sprintf(buf,"this is test data for the named pipe examplen"); fwrite(buf, 1, 80, out_file); fclose(out_file);   2.3.2 消息隊列  消息隊列用于運行于同一臺機器上的進程間通信,它和管道很相似,是一個在系統(tǒng)內(nèi)核中用來保存消息的隊列,它在系統(tǒng)內(nèi)核中是以消息鏈表的形式出現(xiàn)。消息鏈表中節(jié)點的結(jié)構(gòu)用msg聲明。事實上,它是一種正逐漸被淘汰的通信方式,我們可以用流管道或者套接口的方式來取代它,

18、所以,我們對此方式也不再解釋,也建議讀者忽略這種方式。  2.3.3 共享內(nèi)存  共享內(nèi)存是運行在同一臺機器上的進程間通信最快的方式,因為數(shù)據(jù)不需要在不同的進程間復制。通常由一個進程創(chuàng)建一塊共享內(nèi)存區(qū),其余進程對這塊內(nèi)存區(qū)進行 讀寫。得到共享內(nèi)存有兩種方式:映射/dev/mem設(shè)備和內(nèi)存映像文件。前一種方式不給系統(tǒng)帶來額外的開銷,但在現(xiàn)實中并不常用,因為它控制存取的將是 實際的物理內(nèi)存,在Linux系統(tǒng)下,這只有通過限制Linux系統(tǒng)存取的內(nèi)存才可以做到,這當然不太實際。常用的方式是通過shmXXX函數(shù)族來實現(xiàn)利 用共享內(nèi)存進行存儲的。  首先要用的函數(shù)是shmg

19、et,它獲得一個共享存儲標識符。  #include <sys/types.h>  #include <sys/ipc.h>  #include <sys/shm.h>  int shmget(key_t key, int size, int flag);   這個函數(shù)有點類似大家熟悉的malloc函數(shù),系統(tǒng)按照請求分配size大小的內(nèi)存用作共享內(nèi)存。Linux系統(tǒng)內(nèi)核中每個IPC結(jié)構(gòu)都有的一個非負整數(shù) 的標識符,這樣對一個消息隊列發(fā)送消息時只要引用標識符就可以了。這個標識符是內(nèi)核由IPC

20、結(jié)構(gòu)的關(guān)鍵字得到的,這個關(guān)鍵字,就是上面第一個函數(shù)的 key。數(shù)據(jù)類型key_t是在頭文件sys/types.h中定義的,它是一個長整形的數(shù)據(jù)。在我們后面的章節(jié)中,還會碰到這個關(guān)鍵字。       當共享內(nèi)存創(chuàng)建后,其余進程可以調(diào)用shmat()將其連接到自身的地址空間中。  void *shmat(int shmid, void *addr, int flag);  shmid為shmget函數(shù)返回的共享存儲標識符,addr和flag參數(shù)決定了以什么方式來確定連接的地址,函數(shù)的返回值即是該進程數(shù)據(jù)段所連

21、接的實際地址,進程可以對此進程進行讀寫操作。  使用共享存儲來實現(xiàn)進程間通信的注意點是對數(shù)據(jù)存取的同步,必須確保當一個進程去讀取數(shù)據(jù)時,它所想要的數(shù)據(jù)已經(jīng)寫好了。通常,信號量被要來實現(xiàn)對共享存 儲數(shù)據(jù)存取的同步,另外,可以通過使用shmctl函數(shù)設(shè)置共享存儲內(nèi)存的某些標志位如SHM_LOCK、SHM_UNLOCK等來實現(xiàn)。  2.3.4 信號量  信號量又稱為信號燈,它是用來協(xié)調(diào)不同進程間的數(shù)據(jù)對象的,而最主要的應(yīng)用是前一節(jié)的共享內(nèi)存方式的進程間通信。本質(zhì)上,信號量是一個計數(shù)器,它用來記錄對某個資源(如共享內(nèi)存)的存取狀況。一般說來,為了獲得共享資源,進程需要執(zhí)行

22、下列操作:  (1) 測試控制該資源的信號量。  (2) 若此信號量的值為正,則允許進行使用該資源。進程將信號量減1。  (3) 若此信號量為0,則該資源目前不可用,進程進入睡眠狀態(tài),直至信號量值大于0,進程被喚醒,轉(zhuǎn)入步驟(1)。  (4) 當進程不再使用一個信號量控制的資源時,信號量值加1。如果此時有進程正在睡眠等待此信號量,則喚醒此進程。   維護信號量狀態(tài)的是Linux內(nèi)核操作系統(tǒng)而不是用戶進程。我們可以從頭文件/usr/src/linux/include/linux/sem.h 中看到內(nèi)核用來維護信號量狀態(tài)的各個結(jié)構(gòu)的定義。

23、信號量是一個數(shù)據(jù)集合,用戶可以單獨使用這一集合的每個元素。要調(diào)用的第一個函數(shù)是semget,用以獲 得一個信號量ID。 struct sem   short sempid;/* pid of last operaton */  ushort semval;/* current value */  ushort semncnt;/* num procs awaiting increase in semval */  ushort semzcnt;/* num procs awaiting semval = 0 */ #include <sy

24、s/types.h>  #include <sys/ipc.h>  #include <sys/sem.h>  int semget(key_t key, int nsems, int flag);   key是前面講過的IPC結(jié)構(gòu)的關(guān)鍵字,flag將來決定是創(chuàng)建新的信號量集合,還是引用一個現(xiàn)有的信號量集合。nsems是該集合中的信號量數(shù)。如果是創(chuàng)建新 集合(一般在服務(wù)器中),則必須指定nsems;如果是引用一個現(xiàn)有的信號量集合(一般在客戶機中)則將nsems指定為0。  semctl函數(shù)用來對

25、信號量進行操作。  int semctl(int semid, int semnum, int cmd, union semun arg);  不同的操作是通過cmd參數(shù)來實現(xiàn)的,在頭文件sem.h中定義了7種不同的操作,實際編程時可以參照使用。       semop函數(shù)自動執(zhí)行信號量集合上的操作數(shù)組。  int semop(int semid, struct sembuf semoparray, size_t nops);  semoparray是一個指針,它指向一個信號量操作數(shù)組。nops

26、規(guī)定該數(shù)組中操作的數(shù)量。 下面,我們看一個具體的例子,它創(chuàng)建一個特定的IPC結(jié)構(gòu)的關(guān)鍵字和一個信號量,建立此信號量的索引,修改索引指向的信號量的值,最后我們清除信號量。在下面的代碼中,函數(shù)ftok生成我們上文所說的唯一的IPC關(guān)鍵字。 #include <stdio.h> #include <sys/types.h> #include <sys/sem.h> #include <sys/ipc.h> void main()  key_t unique_key; /* 定義一個IPC關(guān)鍵字

27、*/ int id; struct sembuf lock_it; union semun options; int i; unique_key = ftok(".", 'a'); /* 生成關(guān)鍵字,字符'a'是一個隨機種子*/ /* 創(chuàng)建一個新的信號量集合*/ id = semget(unique_key, 1, IPC_CREAT | IPC_EXCL | 0666); printf("semaphore id=%dn", id);

28、0;options.val = 1; /*設(shè)置變量值*/ semctl(id, 0, SETVAL, options); /*設(shè)置索引0的信號量*/ /*打印出信號量的值*/ i = semctl(id, 0, GETVAL, 0); printf("value of semaphore at index 0 is %dn", i); /*下面重新設(shè)置信號量*/ lock_it.sem_num = 0; /*設(shè)置哪個信號量*/ lock_it.sem_op = -1; /*定義操作*/ lock

29、_it.sem_flg = IPC_NOWAIT; /*操作方式*/ if (semop(id, &lock_it, 1) = -1)  printf("can not lock semaphore.n"); exit(1);  i = semctl(id, 0, GETVAL, 0); printf("value of semaphore at index 0 is %dn", i); /*清除信號量*/ semctl(id, 0, IPC_RMID, 0);

30、60; semget()     可以使用系統(tǒng)調(diào)用semget()創(chuàng)建一個新的信號量集,或者存取一個已經(jīng)存在的信號量集:系統(tǒng)調(diào)用:semget();原型:intsemget(key_t key,int nsems,int semflg);返回值:如果成功,則返回信號量集的IPC標識符。如果失敗,則返回-1:errno=EACCESS(沒有權(quán)限)EEXIST(信號量集已經(jīng)存在,無法創(chuàng)建)EIDRM(信號量集已經(jīng)刪除)ENOENT(信號量集不存在,同時沒有使用IPC_CREAT)ENOMEM(沒有足夠的內(nèi)存創(chuàng)建新的信號量集)ENOSPC(超出限制)

31、    系統(tǒng)調(diào)用semget()的第一個參數(shù)是關(guān)鍵字值(一般是由系統(tǒng)調(diào)用ftok()返回的)。系統(tǒng)內(nèi)核將此值和系統(tǒng)中存在的其他的信號量集的關(guān)鍵字值進行比較。打開和存取操作與參數(shù)semflg中的內(nèi)容相關(guān)。IPC_CREAT如果信號量集在系統(tǒng)內(nèi)核中不存在,則創(chuàng)建信號量集。IPC_EXCL當和 IPC_CREAT一同使用時,如果信號量集已經(jīng)存在,則調(diào)用失敗。如果單獨使用IPC_CREAT,則semget()要么返回新創(chuàng)建的信號量集的標識符,要么返回系統(tǒng)中已經(jīng)存在的同樣的關(guān)鍵字值的信號量的標識符。如果IPC_EXCL和IPC_CREAT一同使用,則要么返回新創(chuàng)建的信號量集

32、的標識符,要么返回-1。IPC_EXCL單獨使用沒有意義。參數(shù)nsems指出了一個新的信號量集中應(yīng)該創(chuàng)建的信號量的個數(shù)。信號量集中最多的信號量的個數(shù)是在linux/sem.h中定義的:#defineSEMMSL32/*<=512maxnumofsemaphoresperid*/下面是一個打開和創(chuàng)建信號量集的程序:intopen_semaphore_set(key_t keyval,int numsems)intsid;if(!numsems)return(-1);if(sid=semget(mykey,numsems,IPC_CREAT|0660)=-1)return(-1);retur

33、n(sid);=semop()系統(tǒng)調(diào)用:semop();調(diào)用原型:int semop(int semid,struct sembuf*sops,unsign ednsops);返回值:0,如果成功。-1,如果失?。篹rrno=E2BIG(nsops大于最大的ops數(shù)目)EACCESS(權(quán)限不夠)EAGAIN(使用了IPC_NOWAIT,但操作不能繼續(xù)進行)EFAULT(sops指向的地址無效)EIDRM(信號量集已經(jīng)刪除)EINTR(當睡眠時接收到其他信號)EINVAL(信號量集不存在,或者semid無效)ENOMEM(使用了SEM_UNDO,但無足夠的內(nèi)存創(chuàng)建所需的數(shù)據(jù)結(jié)構(gòu))ERANGE(信

34、號量值超出范圍)    第一個參數(shù)是關(guān)鍵字值。第二個參數(shù)是指向?qū)⒁僮鞯臄?shù)組的指針。第三個參數(shù)是數(shù)組中的操作的個數(shù)。參數(shù)sops指向由sembuf組成的數(shù)組。此數(shù)組是在linux/sem.h中定義的:/*semop systemcall takes an array of these*/structsembufushortsem_num;/*semaphore index in array*/shortsem_op;/*semaphore operation*/shortsem_flg;/*operation flags*/sem_num將要處理的信號量的個數(shù)。s

35、em_op要執(zhí)行的操作。sem_flg操作標志。    如果sem_op是負數(shù),那么信號量將減去它的值。這和信號量控制的資源有關(guān)。如果沒有使用IPC_NOWAIT,那么調(diào)用進程將進入睡眠狀態(tài),直到信號量控制的資源可以使用為止。如果sem_op是正數(shù),則信號量加上它的值。這也就是進程釋放信號量控制的資源。最后,如果sem_op是0,那么調(diào)用進程將調(diào)用sleep(),直到信號量的值為0。這在一個進程等待完全空閑的資源時使用。=semctl()系統(tǒng)調(diào)用:semctl();原型:int semctl(int semid,int semnum,int cmd,union s

36、emunarg);返回值:如果成功,則為一個正數(shù)。如果失敗,則為-1:errno=EACCESS(權(quán)限不夠)EFAULT(arg指向的地址無效)EIDRM(信號量集已經(jīng)刪除)EINVAL(信號量集不存在,或者semid無效)EPERM(EUID沒有cmd的權(quán)利)ERANGE(信號量值超出范圍)    系統(tǒng)調(diào)用semctl用來執(zhí)行在信號量集上的控制操作。這和在消息隊列中的系統(tǒng)調(diào)用msgctl是十分相似的。但這兩個系統(tǒng)調(diào)用的參數(shù)略有不同。因為信號量一般是作為一個信號量集使用的,而不是一個單獨的信號量。所以在信號量集的操作中,不但要知道IPC關(guān)鍵字值,也要知道信號量集中

37、的具體的信號量。這兩個系統(tǒng)調(diào)用都使用了參數(shù)cmd,它用來指出要操作的具體命令。兩個系統(tǒng)調(diào)用中的最后一個參數(shù)也不一樣。在系統(tǒng)調(diào)用msgctl中,最后一個參數(shù)是指向內(nèi)核中使用的數(shù)據(jù)結(jié)構(gòu)的指針。我們使用此數(shù)據(jù)結(jié)構(gòu)來取得有關(guān)消息隊列的一些信息,以及設(shè)置或者改變隊列的存取權(quán)限和使用者。但在信號量中支持額外的可選的命令,這樣就要求有一個更為復雜的數(shù)據(jù)結(jié)構(gòu)。系統(tǒng)調(diào)用semctl()的第一個參數(shù)是關(guān)鍵字值。第二個參數(shù)是信號量數(shù)目。    參數(shù)cmd中可以使用的命令如下:    ·IPC_STAT讀取一個信號量集的數(shù)據(jù)結(jié)構(gòu)semid_ds,并

38、將其存儲在semun中的buf參數(shù)中。    ·IPC_SET設(shè)置信號量集的數(shù)據(jù)結(jié)構(gòu)semid_ds中的元素ipc_perm,其值取自semun中的buf參數(shù)。    ·IPC_RMID將信號量集從內(nèi)存中刪除。    ·GETALL用于讀取信號量集中的所有信號量的值。    ·GETNCNT返回正在等待資源的進程數(shù)目。    ·GETPID返回最后一個執(zhí)行semop操作的進程的PID。 

39、   ·GETVAL返回信號量集中的一個單個的信號量的值。    ·GETZCNT返回這在等待完全空閑的資源的進程數(shù)目。    ·SETALL設(shè)置信號量集中的所有的信號量的值。    ·SETVAL設(shè)置信號量集中的一個單獨的信號量的值。    參數(shù)arg代表一個semun的實例。semun是在linux/sem.h中定義的:/*arg for semctl systemcalls.*/unionsemunintval

40、;/*value for SETVAL*/structsemid_ds*buf;/*buffer for IPC_STAT&IPC_SET*/ushort*array;/*array for GETALL&SETALL*/structseminfo*_buf;/*buffer for IPC_INFO*/void*_pad;    val當執(zhí)行SETVAL命令時使用。buf在IPC_STAT/IPC_SET命令中使用。代表了內(nèi)核中使用的信號量的數(shù)據(jù)結(jié)構(gòu)。array在使用GETALL/SETALL命令時使用的指針。   

41、 下面的程序返回信號量的值。當使用GETVAL命令時,調(diào)用中的最后一個參數(shù)被忽略:intget_sem_val(intsid,intsemnum)return(semctl(sid,semnum,GETVAL,0);    下面是一個實際應(yīng)用的例子:#defineMAX_PRINTERS5printer_usage()int x;for(x=0;x<MAX_PRINTERS;x+)printf("Printer%d:%dnr",x,get_sem_val(sid,x);    下面的程序可以用來初始化一個新的

42、信號量值:void init_semaphore(int sid,int semnum,int initval)union semunsemopts;semopts.val=initval;semctl(sid,semnum,SETVAL,semopts);    注意系統(tǒng)調(diào)用semctl中的最后一個參數(shù)是一個聯(lián)合類型的副本,而不是一個指向聯(lián)合類型的指針。  2.3.5 套接口  套接口(socket)編程是實現(xiàn)Linux系統(tǒng)和其他大多數(shù)操作系統(tǒng)中進程間通信的主要方式之一。我們熟知的WWW服務(wù)、FTP服務(wù)、TELNET服務(wù) 等都是基于套接口編程

43、來實現(xiàn)的。除了在異地的計算機進程間以外,套接口同樣適用于本地同一臺計算機內(nèi)部的進程間通信。關(guān)于套接口的經(jīng)典教材同樣是 Richard Stevens編著的Unix網(wǎng)絡(luò)編程:聯(lián)網(wǎng)的API和套接字,清華大學出版社出版了該書的影印版。它同樣是Linux程序員的必備書籍之一。  關(guān)于這一部分的內(nèi)容,可以參照本文作者的另一篇文章設(shè)計自己的網(wǎng)絡(luò)螞蟻,那里由常用的幾個套接口函數(shù)的介紹和示例程序。這一部分或許是Linux進程 間通信編程中最須關(guān)注和最吸引人的一部分,畢竟,Internet 正在我們身邊以不可思議的速度發(fā)展著,如果一個程序員在設(shè)計編寫他下一個程序的時候,根本沒有考慮到網(wǎng)絡(luò),考慮到Internet,那么,可以說,他的設(shè) 計很難成功。 3 Linux的進程和Win32的進程/線程比較  熟悉WIN32編程的人一定知道,WIN32的進程管理方式與Linux上有著很大區(qū)別,在UNIX里,只有進程的概念,但在WIN32里卻還有一個"線程"的概念,那么Linux和WIN32在這里究竟有著什么區(qū)別呢? 

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論