資源描述:
《linux下c語言編程4-使用共享內(nèi)存實(shí)現(xiàn)進(jìn)程間通信》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、linux下C語言編程4-使用共享內(nèi)存實(shí)現(xiàn)進(jìn)程間通信共享內(nèi)存的函數(shù)有以下幾個(gè):(1)intshmget(key_tkey,intsize,intshmflg),開辟或使用一塊共享內(nèi)存。(2)void*shmat(intshmid,constvoid*shmaddr,intshmflg),將參數(shù)shmid所指向的共享內(nèi)存與當(dāng)前進(jìn)程連接。當(dāng)使用某共享內(nèi)存時(shí),需要先使用shmat,達(dá)成連接。(3)intshmdt(constvoid*shmaddr),將先前用shmat連接的共享內(nèi)存與當(dāng)前進(jìn)程解除連接。參數(shù)s
2、hmaddr為shmat返回的共享內(nèi)存的地址。在完成對共享內(nèi)存的使用后,需要使用shmdt解除連接。(4)intshmctl(intshmid,intcmd,structshmid_ds*buf),控制內(nèi)存的操作。當(dāng)cmd為IPC_RMID時(shí),刪除shmid所指的共享內(nèi)存。這些函數(shù)的表頭文件為和,其詳細(xì)參數(shù)請去網(wǎng)上搜索。下面給出一個(gè)使用共享內(nèi)存實(shí)現(xiàn)進(jìn)程間通信的例子:進(jìn)程A開辟一塊新的共享內(nèi)存,進(jìn)程B修改這個(gè)共享內(nèi)存,進(jìn)程C打印輸出這個(gè)共享內(nèi)存的內(nèi)容,進(jìn)程D刪除
3、這個(gè)共享內(nèi)存。進(jìn)程BCD運(yùn)行的命令格式為:命令共享內(nèi)存ID,如./output123432。進(jìn)程A代碼如下:intmain(){intshmid;shmid=shmget(IPC_PRIVATE,SIZE,IPC_CREAT
4、0600);if(shmid<0){perror("shmgeterror");exit(1);}printf("createsharedmemoryOK.shmid=%d/n",shmid);return0;}進(jìn)程B代碼如下:intmain(intargc,char*argv[]
5、){intshmid;char*shmaddr;if(argc!=2){perror("argcerror/n");exit(1);}shmid=atoi(argv[1]);shmaddr=(char*)shmat(shmid,NULL,0);if((int)shmaddr==-1){perror("shmaterror./n");exit(1);}strcpy(shmaddr,"hello,world!");shmdt(shmaddr);return0;}進(jìn)程C代碼如下:intmain(intargc
6、,char*argv[]){intshmid;char*shmaddr;if(argc!=2){printf("argcerror/n");exit(1);}shmid=atoi(argv[1]);shmaddr=(char*)shmat(shmid,NULL,0);if((int)shmaddr==-1){perror("shmaterror./n");exit(1);}printf("%s/n",shmaddr);shmdt(shmaddr);return0;}進(jìn)程D代碼如下:intmain(int
7、argc,char*argv[]){intshmid;if(argc!=2){perror("argcerror/n");exit(1);}shmid=atoi(argv[1]);shmctl(shmid,IPC_RMID,NULL);return0;}linux下C語言編程5-多線程編程Linux系統(tǒng)下的多線程遵循POSIX線程接口,稱為pthread。編寫Linux下的多線程程序,需要使用頭文件pthread.h,編譯需要在后面加-lpthread。關(guān)于多線程,主要有以下幾個(gè)過程:1,創(chuàng)建線程2,各
8、個(gè)線程的執(zhí)行3,等待線程的結(jié)束涉及的線程函數(shù)主要有:1,intpthread_create(pthread_t*restricttidp,constpthread_attr_t*restrictattr,void*(*start_rtn)(void),?void*restrictarg);函數(shù)有4個(gè)參數(shù):第一個(gè)參數(shù)為指向線程標(biāo)識符的指針。第二個(gè)參數(shù)用來設(shè)置線程屬性。第三個(gè)參數(shù)是一個(gè)函數(shù)指針(有關(guān)函數(shù)指針,看這里),指向線程運(yùn)行函數(shù)的起始地址。最后一個(gè)參數(shù)是函數(shù)指針?biāo)枰膮?shù)。注意:pthread_cr
9、eate函數(shù)返回0表示成功。另外如果函數(shù)指針需要多個(gè)參數(shù)的話,就將這些參數(shù)做成某個(gè)結(jié)構(gòu)體,作為第4個(gè)參數(shù)。如果有返回值的話,也可將返回值的指針回寫到第4個(gè)參數(shù)中。2,pthread_join()等待一個(gè)線程的結(jié)束。pthread_exit()用于線程退出,可以指定返回值,以便其他線程通過pthread_join()函數(shù)獲取該線程的返回值。線程的應(yīng)用:并行數(shù)據(jù)庫的查詢假設(shè)我們有3臺計(jì)算機(jī)A,B,C,每臺均安裝PG數(shù)據(jù)庫,通過網(wǎng)絡(luò)連接。我們可以