




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、LinuxLinux進(jìn)程間通信進(jìn)程間通信講師:朱景堯C語言語言C+語言語言 傳智播客傳智播客 高薪就業(yè)高薪就業(yè)ContentsContents無名管道無名管道 有名管道有名管道共享內(nèi)存共享內(nèi)存 123共享庫共享庫so 第一章第一章 無名管道無名管道u無名管道u無名管道是半雙工的,就是對(duì)于一個(gè)管道來講,只能讀,或者寫。u無名管道只能在相關(guān)的、有共同祖先的進(jìn)程間使用。u一個(gè)fork或者exec調(diào)用創(chuàng)建的子進(jìn)程繼承了父進(jìn)程的文件描述符。第一章第一章 無名管道無名管道u打開和關(guān)閉管道。uint pipe(int filedes2);u在你從一個(gè)管道中讀出或者寫入數(shù)據(jù),這個(gè)管道必須存在。u如果成功建立了
2、管道,則會(huì)打開兩個(gè)文件描述符,并把它們的值保存在一個(gè)整數(shù)數(shù)組中。u第一個(gè)文件描述符用于讀取數(shù)據(jù),第二個(gè)文件描述符用于寫入數(shù)據(jù)。u如果出錯(cuò)返回-1,同時(shí)設(shè)置errnou關(guān)閉一個(gè)管道用close()函數(shù)第一章第一章 無名管道無名管道u讀寫管道。u讀寫管道與讀寫普通文件方式一樣,調(diào)用write與read函數(shù)即可。u幾乎不會(huì)在一個(gè)進(jìn)程中打開一個(gè)管道僅供進(jìn)程自己使用,管道是用來交換數(shù)據(jù)的。u因?yàn)橐粋€(gè)進(jìn)程已經(jīng)能夠訪問它要通過管道共享的數(shù)據(jù),和自己共享數(shù)據(jù)是沒有意義的。u試圖對(duì)一個(gè)管道的兩端進(jìn)行讀寫操作是一個(gè)嚴(yán)重的錯(cuò)誤。第一章第一章 無名管道無名管道u讀寫無名管道的例子。int main(int arg,
3、char * args)int fd2;char buf100;int len;pipe(fd);memset(buf, 0, sizeof(buf);int pid = fork();if (pid = 0)close(fd1);while(len = read(fd0, buf, sizeof(buf) 0)write(STDOUT_FILENO, buf, len);close(fd0);elseclose(fd0);strcpy(buf, hello worldn);write(fd1, buf, sizeof(buf);close(fd1);waitpid(pid, NULL, 0)
4、;return 0;ContentsContents無名管道無名管道 有名管道有名管道共享內(nèi)存共享內(nèi)存 123共享庫共享庫so 第二章第二章 有名管道有名管道u有名管道(FIFO)。u有名管道是持久穩(wěn)定的。u它們存在于文件系統(tǒng)中。uFIFO比無名管道作用更大,因?yàn)樗鼈兡茏専o關(guān)聯(lián)的進(jìn)程之間交換數(shù)據(jù)。u一個(gè)shell命令可以建立有名管道umkfifo option nameumkfifo創(chuàng)建一個(gè)名為name的有名管道第二章第二章 有名管道有名管道umkfifo fifo1。u創(chuàng)建一個(gè)有名管道fifo1。ucat fifo1。u將ls命令輸出的結(jié)果寫入fifo1中第二章第二章 有名管道有名管道u創(chuàng)建
5、fifo。uint mkfifo(const char *pathname, mode_t mode)u函數(shù)執(zhí)行成功返回0,否則返回-1,并設(shè)置變量errno。第二章第二章 有名管道有名管道umkfifo函數(shù)例子。u八進(jìn)制數(shù)0666轉(zhuǎn)化為二進(jìn)制后為110110110,代表讀寫權(quán)限為rw-rw-rw-int main(int arg, char *args)mkfifo(fifo1, 0666);return 0;第二章第二章 有名管道有名管道u刪除fifo。uint unlink(const char *pathname);u函數(shù)執(zhí)行成功返回0,否則返回-1,并設(shè)置變量errno。第二章第二章
6、 有名管道有名管道uunlink函數(shù)例子。int main(int arg, char * args)int i = unlink(fifo1);if (i = -1)printf(strerror(errno);return 0;第二章第二章 有名管道有名管道u打開和關(guān)閉FIFO。uint open(const char *pathname, int flags);uint close(int fd);uLinux的一切都是文件這一抽象概念的優(yōu)勢(shì),打開和關(guān)閉FIFO和打開關(guān)閉一個(gè)普通文件操作是一樣的。uFIFO的兩端使用前都必須要打開。uopen中如果參數(shù)flags為O_RDONLY將阻塞o
7、pen調(diào)用,一直到另一個(gè)進(jìn)程為寫入數(shù)據(jù)打開FIFO為止。相同的,O_WRONLY也導(dǎo)致阻塞一直到為讀出數(shù)據(jù)打開FIFO為止。第二章第二章 有名管道有名管道u讀FIFO例子u寫FIFO例子int main(int arg, char * args)int len = 0;char buf100;memset(buf, 0, sizeof(buf);int fd = open(fifo1, O_RDONLY);while (len = read(fd, buf, sizeof(buf) 0)printf(%sn, buf);close(fd);return 0;int main(int arg,
8、char * args)int len = 0;char buf100;memset(buf, 0, sizeof(buf);int fd = open(fifo1, O_WRONLY);while(1)scanf(%s, buf);if (buf0 = 0)break;write(fd, buf, sizeof(buf);close(fd);return 0;ContentsContents無名管道無名管道 有名管道有名管道共享內(nèi)存共享內(nèi)存 123共享庫共享庫so 第三章第三章 共享內(nèi)存共享內(nèi)存u共享內(nèi)存是由內(nèi)核出于在多個(gè)進(jìn)程間交換信息的目的而留出的一塊內(nèi)存區(qū)(段)。u如果段的權(quán)限設(shè)置恰當(dāng),
9、每個(gè)要訪問該段內(nèi)存的進(jìn)程都可以把它映像到自己的私有地址空間中。u如果一個(gè)進(jìn)程更新了段中的數(shù)據(jù),其他進(jìn)程也立即會(huì)看到更新。u由一個(gè)進(jìn)程創(chuàng)建的段,也可以由另一個(gè)進(jìn)程讀寫。u每個(gè)進(jìn)程都把它自己對(duì)共享內(nèi)存的映像放入自己的地址空間。第三章第三章 共享內(nèi)存共享內(nèi)存u創(chuàng)建共享內(nèi)存區(qū)。u#include u#include uint shmget(key_t key, size_t size, int shm-flg);u參數(shù)key既可以是IPC_PRIVATE,也可是是ftok函數(shù)返回的一個(gè)關(guān)鍵字。u參數(shù)size指定段的大小。u參數(shù)flagsu八進(jìn)制數(shù),0 xxx。轉(zhuǎn)化為二進(jìn)制后分別代表rw-rw-rw-u
10、shmget成功返回段標(biāo)示符,失敗返回-1。第三章第三章 共享內(nèi)存共享內(nèi)存u創(chuàng)建共享內(nèi)存區(qū)。uint main(int arg, char * args)uuint shmid = shmget(IPC_PRIVATE, 1024, 0666);uif (shmid 1)shmid = atoi(args1);shmbuf = shmat(shmid, 0, 0);sleep(60);shmdt(shmbuf);return 0;第三章第三章 共享內(nèi)存共享內(nèi)存u共享內(nèi)存讀寫例子。int main(int arg, char * args)char *shmbuf;int shmid = 0;i
11、f (arg 2)shmid = atoi(args1);shmbuf = shmat(shmid, 0, 0);if (atoi(args2) = 1) /write shared memscanf(%sn, shmbuf);if (atoi(args2) = 2) /read shared memprintf(%sn, shmbuf);shmdt(shmbuf);return 0;ContentsContents無名管道無名管道 有名管道有名管道共享內(nèi)存共享內(nèi)存 123共享庫共享庫so 第四章第四章 共享庫共享庫sosouso文件在linux中為共享庫,與windows下的dll類似。us
12、o文件中的函數(shù)可供多個(gè)進(jìn)程調(diào)用,最大可能的提供二進(jìn)制代碼的復(fù)用。u共享庫可以使代碼的維護(hù)工作大大簡化,當(dāng)修正了一些錯(cuò)誤或者添加了新特性的時(shí)候,用戶只需要獲得升級(jí)后的so并安裝他就可以。u注:即使不同的進(jìn)程調(diào)用同一個(gè)so文件,通過共享庫并不能實(shí)現(xiàn)不同進(jìn)程間的通訊,因?yàn)橥粋€(gè)so被不同進(jìn)程加載加載到不同的內(nèi)存空間。第四章第四章 共享庫共享庫sosouso文件編譯方法uso文件的源文件中不需要有main函數(shù),即使有也不會(huì)被執(zhí)行。u編譯的時(shí)候gcc需要加-fPIC選項(xiàng),這可以使gcc產(chǎn)生與位置無關(guān)的代碼。u連接的時(shí)候gcc使用-shared選項(xiàng),指示生成一個(gè)共享庫文件。u共享庫文件名要以lib開頭,擴(kuò)
13、展名為.so。第四章第四章 共享庫共享庫sosou編寫so的例子。utest.c源文件int max(int a, int b)if (a b)return a;elsereturn b;int add(int a, int b)return a + b;第四章第四章 共享庫共享庫sosou 編寫so的例子。u test.h頭文件#ifndef TEST_H_#define TEST_H_int max(int a, int b);int add(int a, int b);#endif /* TEST_H_ */第四章第四章 共享庫共享庫sosou編寫so的例子。umakefile.SUFF
14、IXES:.c .oCC=gccSRCS=test.cEXEC=libtest.soOBJS=$(SRCS:.c=.o)start:$(OBJS)$(CC) -shared -o $(EXEC) $(OBJS) .c.o:$(CC) -g -fPIC -o $ -c $clean:rm -f $(OBJS)第四章第四章 共享庫共享庫sosouso文件使用方法u為了讓linux能找到so文件的位置,需要在.bash_profile中添加export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.u或者將so文件放入linux的系統(tǒng)目錄/usr/lib/u在c文件中使用so文
15、件,首先需要 #inluce相關(guān)h文件。ugcc連接時(shí)添加 L參數(shù)指明so文件存放路徑,-l參數(shù)指明so文件名u以libtest.so文件在當(dāng)前路徑下舉例ugcc -L. -ltest -o a a.ou其中-L.意思為在當(dāng)前路徑下尋找so文件u-ltest意思為要鏈接libtest.so這個(gè)庫文件u-o a 意思為編譯后的可執(zhí)行文件名為第四章第四章 共享庫共享庫sosou調(diào)用so的例子。ua.c#include test.h#include int main() printf(%dn, max(4, 5); printf(%dn, add(4, 5); return 0;第四章第四章 共享庫
16、共享庫sosou調(diào)用so的例子。umakefile.SUFFIXES:.c .oCC=gccSRCS=a.cEXEC=aOBJS=$(SRCS:.c=.o)start:$(OBJS) $(CC) -L. -ltest -o $(EXEC) $(OBJS) .c.o: $(CC) -o $ -c $clean: rm -f $(OBJS)第四章第四章 共享庫共享庫sosou當(dāng)我們?cè)赾pp文件中包含test.h文件,用g+鏈接libtest.so這個(gè)庫時(shí)會(huì)報(bào)錯(cuò):u(.text+0 x19): undefined reference to max(int, int)u(.text+0 x3d): u
17、ndefined reference to add(int, int)u為了使我們編寫的so文件同時(shí)可以被C或者C+調(diào)用,我們需要修改一下h文件中的函數(shù)申明部分。u增加帶有_cplusplus的預(yù)編譯指令。u_cplusplus是c+編譯器預(yù)定義的一個(gè)宏,比如用g+的時(shí)候這個(gè)宏就被提前定義了第四章第四章 共享庫共享庫sosou 編寫so的例子。u test.h頭文件u 如果是c+編譯器會(huì)默認(rèn)定義_cplusplus這個(gè)宏。u 當(dāng)使用gcc編譯的時(shí)候產(chǎn)生如下結(jié)果:u int max(int a, int b);u int add(int a, int b);u 當(dāng)使用g+編譯的時(shí)候,產(chǎn)生如下結(jié)果:u extern Cu int m
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年監(jiān)理工程師合同管理工程合同變更程序知識(shí)點(diǎn)練習(xí)
- 廢水處理技術(shù)生態(tài)修復(fù)應(yīng)用考核試卷
- 運(yùn)動(dòng)傷害預(yù)防與賽事醫(yī)療救援的融合策略考核試卷
- 兵器試驗(yàn)面試題及答案
- 法醫(yī)內(nèi)部考試題及答案
- 戰(zhàn)略協(xié)同與目標(biāo)一致性與否考核試卷
- 風(fēng)機(jī)公司面試題及答案
- 紹興市焊工考試試題及答案
- 生物演化試題及答案
- 卡塔爾介紹課件
- MT/T 548-1996單體液壓支柱使用規(guī)范
- GB/T 9765-2009輪胎氣門嘴螺紋
- GB/T 23806-2009精細(xì)陶瓷斷裂韌性試驗(yàn)方法單邊預(yù)裂紋梁(SEPB)法
- 2022年04月四川宜賓市敘州區(qū)面向區(qū)內(nèi)外考試選調(diào)在編在職教師136人考試押題庫【1000題】含答案附帶詳解析
- FZ/T 74001-2020紡織品針織運(yùn)動(dòng)護(hù)具
- 圖解“雙均線雙交叉”期貨、股票操作系統(tǒng)課件
- 宮外孕右輸卵管妊娠腹腔鏡下盆腔粘連分解術(shù)、右輸卵管妊娠開窗取胚術(shù)手術(shù)記錄模板
- 美軍標(biāo)電子裝備環(huán)境試驗(yàn)-mil-std-810g
- 混凝土重力壩設(shè)計(jì)說明書
- 應(yīng)用回歸分析(第三版)何曉群_劉文卿_課后習(xí)題答案_完整版
- 道路及兩側(cè)便道保潔方案.docx
評(píng)論
0/150
提交評(píng)論