操作系統(tǒng)管道通信_(tái)第1頁(yè)
操作系統(tǒng)管道通信_(tái)第2頁(yè)
操作系統(tǒng)管道通信_(tái)第3頁(yè)
操作系統(tǒng)管道通信_(tái)第4頁(yè)
操作系統(tǒng)管道通信_(tái)第5頁(yè)
已閱讀5頁(yè),還剩23頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、河南城建學(xué)院操作系統(tǒng)課程設(shè)計(jì)說明書設(shè)計(jì)題目: 管道通信 專 業(yè): 計(jì)算機(jī)科學(xué)與技術(shù) 指導(dǎo)教師: 邵國(guó)金 郭猛 薛冰 班 級(jí): 0814102 學(xué) 號(hào): 081410217 姓 名: 金 賀 同 組 人: 李乾坤 邵光光 計(jì)算機(jī)科學(xué)與工程系2011年1 月 10 日前言課程設(shè)計(jì)是檢測(cè)學(xué)生課程效果的重要手段,是訓(xùn)練學(xué)生通過所學(xué)的知識(shí)解決實(shí)際問題的重要方式,同時(shí)也是實(shí)踐性教學(xué)中的一個(gè)重要環(huán)節(jié),它以某以課程為基礎(chǔ),可以涉及和課程相關(guān)的各個(gè)方面,是一門獨(dú)立于課程之外的特殊課程。課程設(shè)計(jì)是讓學(xué)生對(duì)所學(xué)的課程更全面的學(xué)習(xí)和應(yīng)用,理解和掌握課程的相關(guān)知識(shí)。操作系統(tǒng)是一門重要的專業(yè)課,是計(jì)算機(jī)理論和應(yīng)用的核心基

2、礎(chǔ)課程。操作系統(tǒng)課程設(shè)計(jì),是一次對(duì)多學(xué)知識(shí)的綜合演練,要求學(xué)生在操作系統(tǒng)的設(shè)計(jì)理念、整體機(jī)構(gòu)、模塊劃分、數(shù)據(jù)結(jié)構(gòu)的選擇和應(yīng)用、算法的設(shè)計(jì)及其實(shí)現(xiàn)等方面,加深對(duì)課程基本內(nèi)容的理解,同時(shí),在課程設(shè)計(jì)方法以及上機(jī)操作等基本技能和科學(xué)作風(fēng)方面收到比較系統(tǒng)和嚴(yán)格的訓(xùn)練。在這次的課程設(shè)計(jì)中我們選擇的題目是進(jìn)程間通信消息機(jī)制的設(shè)計(jì),實(shí)現(xiàn)消息的創(chuàng)建、發(fā)送和接收及在server端創(chuàng)建一個(gè)服務(wù)函數(shù),從而形成C/S通訊模式。消息機(jī)制是消息通過消息隊(duì)列的方式進(jìn)行進(jìn)程間消息的傳遞,通過此次課程設(shè)計(jì),全面理解消息機(jī)制進(jìn)程間通信方法。實(shí)現(xiàn)把死板的課本知識(shí)變得生動(dòng)有趣,激發(fā)了學(xué)生的積極性。把學(xué)過的計(jì)算機(jī)操作系統(tǒng)的知識(shí)強(qiáng)化,能

3、夠把課堂上的知識(shí)通過自己設(shè)計(jì)的程序表示出來,加深了歲理論知識(shí)的理解目的。目 錄一、.4二、.4三、設(shè)計(jì)題目及要求.4(1)設(shè)計(jì)管道通信4(2)設(shè)計(jì)命名管道.4四、總體設(shè)計(jì).4五、詳細(xì)設(shè)計(jì).61、實(shí)現(xiàn)管道通信 .6 2、命名管道設(shè)計(jì) .8六、調(diào)試與測(cè)試方法.12七、執(zhí)行結(jié)果及分析.13八、源程序清單.14九、心得體會(huì).19十、參考文獻(xiàn).19三、系統(tǒng)環(huán)境1、硬件環(huán)境:Intel(R)Core (TM)2 Duo CPU E7200 2.53GHz1.59GHz,2.00GB的內(nèi)存2、軟件環(huán)境 Microsoft Windows XPProfesstonal版本 2002Service Pack 3

4、 四、設(shè)計(jì)目的利用UNIX系統(tǒng)提供的管道機(jī)制實(shí)現(xiàn)進(jìn)程間的通信。(1)管道通信。利用pipe()和lockf()系統(tǒng)調(diào)用,編寫程序,實(shí)現(xiàn)同族進(jìn)程間的通信。使用系統(tǒng)調(diào)用pipe()建立一條管道線;創(chuàng)建子進(jìn)程P1,P2,。子進(jìn)程Pi分別向管道各寫信息,而父進(jìn)程則從管道中讀出來自于各子進(jìn)程的信息,實(shí)現(xiàn)進(jìn)程家族間無名管道通訊。擴(kuò)展之,使之成為客戶/服務(wù)器模式,并完成一定的任務(wù)(自己定義)。(2)命名管道通信:利用mkfifo(name,mode)或mknod(name,mode,0)創(chuàng)建一個(gè)命名管道,然后利用它和文件部分系統(tǒng)調(diào)用實(shí)現(xiàn)不同進(jìn)程間的通信。改造之,使之成為客戶/服務(wù)器模式,并完成一定的任務(wù)(自

5、己定義)。五、總體設(shè)計(jì)1.fork()創(chuàng)建一個(gè)新進(jìn)程。用法:int fork()其中返回int取值意義如下:0:創(chuàng)建子進(jìn)程,從子進(jìn)程返回的id值0:從父進(jìn)程返回的子進(jìn)程id值-1:創(chuàng)建失敗2.lockf(files,function,size)用作鎖定文件的某些段或者整個(gè)文件。頭文件:#include參數(shù)定義:int lockf(files,function,size);int files,function;long size;其中:files是文件描述符;function是鎖定和解鎖;1表示鎖定;0表示解鎖;Size是鎖定或解鎖的字節(jié)數(shù),若用0,表示從文件的當(dāng)前位置到文件尾。3.read功能

6、:從描述符為filedes的文件讀信息。用法:#include ssize_tread(int filedes, void *buff, size_t nbytes) ;返回:讀到的字節(jié)數(shù),若已到文件尾為0,若出錯(cuò)為-1。 在UNIX/Linux 可重定義為: intread(int fd, char *buff, unsigned nbytes) ;4.write功能:向已打開的文件寫數(shù)據(jù)。用法:#include ssize_t write(int filedes, const void * buff, size_t nbytes) ;返回值:若成功為已寫入的字節(jié)數(shù);出錯(cuò)為-1。intwri

7、te(int fd, char *buff, unsigned nbytes) ;文件位置指針文件位置指針:每個(gè)打開文件都有一個(gè)與其相關(guān)聯(lián)的“當(dāng)前位移量”。是從文件開始處計(jì)算的字節(jié)數(shù)。通常,讀、寫操作都從當(dāng)前文件位置處開始,并使位移量增加所讀或?qū)懙淖止?jié)數(shù)。按系統(tǒng)默認(rèn),當(dāng)打開一個(gè)文件時(shí),除非指定O_APPEND選擇項(xiàng),否則該位移量被設(shè)置為0,即指向文件的開始處。文件位置指針可以通過系統(tǒng)調(diào)用lseek來移動(dòng)。5.創(chuàng)建用mkfifo或mknod創(chuàng)建一個(gè)命名管道。以mkfifo為例:#include#includeint mkfifo(const char *fifo_name, mode_t mod

8、e);/成功返回0,否則為-16 signal(sig,function)允許調(diào)用進(jìn)程控制軟中斷信號(hào)的處理。頭文件:#include參數(shù)定義signal(sig,function)intsig;void(*function)();返回值:成功時(shí)返回舊的(以前)函數(shù)描述,失敗時(shí)返回SIG_ERR。7、client、server可以以client/server方式使用FIFO。如果一個(gè)服務(wù)器有多個(gè)客戶時(shí),每個(gè)客戶可通過一個(gè)well_known FIFO服務(wù)器連接。連接后可以通過well_known FIFO向服務(wù)器發(fā)送請(qǐng)求,所發(fā)信息的長(zhǎng)度必須PIPE_BUF (4096)。 流程圖初始化創(chuàng)建一個(gè)k

9、ey為105、107 的消息隊(duì)列等待msgqid1發(fā)來消息存儲(chǔ)到文件 接收消息 顯示消息 向msgqid2發(fā)送收到命令 收到exit命令 掛起5秒 刪除消息隊(duì)列 退出消息的創(chuàng)建、發(fā)送和接收示意圖初始化創(chuàng)建子進(jìn)程server()創(chuàng)建成功? 由關(guān)鍵字獲得消息隊(duì)列從隊(duì)列接收消息消息類型i為1時(shí),釋放隊(duì)列刪除隊(duì)列表項(xiàng) 退出 六 詳細(xì)設(shè)計(jì) 1、實(shí)現(xiàn)管道通信編制一段程序,實(shí)現(xiàn)進(jìn)程的管道通信。使用系統(tǒng)調(diào)用pipe()建立一條管道線。兩個(gè)子進(jìn)程p1和p2分別向管道各寫一句話:child 1 is sending message!child 2 is sending message!而父進(jìn)程則從管道中讀出來自于

10、兩個(gè)子進(jìn)程的信息,顯示在屏幕上。#include main() int i,r,p1,p2,fd2; char buf50,s50; pipe(fd); /創(chuàng)建匿名管道,fd0為讀端,fd1為寫端/while(p1=fork()=-1); /創(chuàng)建子進(jìn)程P1,直至成功為止(p1!=-1)/if(p1=0) /子進(jìn)程P1執(zhí)行邏輯/ lockf(fd1,1,0); /鎖定管道寫端,保證寫入數(shù)據(jù)的完整性/sprintf(buf,child process P1 is sending messages!n); /在buf中填入準(zhǔn)備寫入管道的信息數(shù)據(jù)printf(child processP1!n); /

11、打印“子進(jìn)程P1正在運(yùn)行” /write(fd1,buf,50); /向管道寫端fd1寫入buf中的數(shù)據(jù),寫完后該數(shù)據(jù)即可以從讀端fd0讀出/sleep(5); /睡眠5秒/lockf(fd1,0,0); /解鎖管道寫端/exit(0); /子進(jìn)程P1退出/ else /主進(jìn)程的執(zhí)行邏輯/ while(p2=fork()=-1); /創(chuàng)建第二個(gè)子進(jìn)程P2/if(p2=0) /子進(jìn)程P2的執(zhí)行邏輯/ lockf(fd1,1,0); /鎖定管道寫端,保證數(shù)據(jù)寫入完整/sprintf(buf,child process P2 is sending messages!n); /在buf中填入準(zhǔn)備寫入管

12、道的信息數(shù)據(jù)printf(child processP2!n); /打印“子進(jìn)程P2正在運(yùn)行” /write(fd1,buf,50); /向管道寫端fd1寫入buf中的數(shù)據(jù),寫完后該數(shù)據(jù)即可從讀端fd0讀出/sleep(5); /睡眠5秒/lockf(fd1,0,0); /解鎖管道寫端/exit(0); /子進(jìn)程P2退出/ /以下為主進(jìn)程執(zhí)行邏輯/wait(0); /等待某個(gè)子進(jìn)程退出/if(r=read(fd0,s,50)=-1) /從管道讀端fd0讀取P1或者P2寫入的數(shù)據(jù)(視哪個(gè)子進(jìn)程搶先執(zhí)行到lockf函數(shù))/ printf(:cant read pipen); /讀取失敗,打印錯(cuò)誤信

13、息/ else printf(:%sn,s); /打印出讀到的信息數(shù)據(jù)/ wait(0); /等待第二個(gè)子進(jìn)程退出/if(r=read(fd0,s,50)=-1) /從管道讀端fd0讀取出P1或者P2寫入的數(shù)據(jù)(視哪個(gè)子進(jìn)程后執(zhí)行到lockf函數(shù))/ printf(:cant read pipen); /讀取失敗,打印錯(cuò)誤信息/ else printf(:%sn,s); /打印讀取到的信息數(shù)據(jù)/ exit(0); /主進(jìn)程退出/ 2、命名管道設(shè)計(jì)。命名管道的通信例子中包括client端和server端。它們?cè)创a文件名稱分別為fifo_clt.c和fifo_svr.c,還有一個(gè)公共常量的有關(guān)文

14、件被打包在文件fifo_hd.h運(yùn)行時(shí),client只運(yùn)行一次就將退出,而server端作為服務(wù)器仍將繼續(xù)運(yùn)行,你再次啟動(dòng)client來請(qǐng)求服務(wù)。FIFO的用法1、創(chuàng)建用mkfifo或mknod創(chuàng)建一個(gè)命名管道。以mkfifo為例:#include#includeint mkfifo(const char *fifo_name, mode_t mode);/成功返回0,否則為-12、使用管道一經(jīng)創(chuàng)建,就可向普通文件一樣使用??赏ㄟ^系統(tǒng)調(diào)用open,close,read,write,unlink等進(jìn)行操作。管道打開過程中,變量O_NONBLOCK將影響打開后對(duì)文件的操作。默認(rèn)情況下該變量不設(shè)置,

15、也就是以阻塞方式打開。這樣可以保證原子性操作。(因此可以不考慮該參數(shù)。)在操作過程中,如果對(duì)一個(gè)管道進(jìn)行寫操作write,若對(duì)方?jīng)]有以讀方式打開將產(chǎn)生SIGPIPE。你可以捕獲此信號(hào)進(jìn)行處理。默認(rèn)情況下是出現(xiàn)寫錯(cuò)誤。當(dāng)最后一個(gè)寫入者關(guān)閉了管道,將產(chǎn)生一個(gè)文件結(jié)束標(biāo)志EOF。3、client、server可以以client/server方式使用FIFO。如果一個(gè)服務(wù)器有多個(gè)客戶時(shí),每個(gè)客戶可通過一個(gè)well_known FIFO服務(wù)器連接。連接后可以通過well_known FIFO向服務(wù)器發(fā)送請(qǐng)求,所發(fā)信息的長(zhǎng)度必須PIPE_BUF (4096)。如果客戶服務(wù)器模式是并發(fā)型的話,則客戶機(jī)不能再

16、通過well_known FIFO回讀信息。此時(shí)可采用在已連接的客戶與服務(wù)器之間建立一個(gè)私有通訊管道的辦法來進(jìn)行通信。該私有管道被服務(wù)器創(chuàng)建后可以以I/O方式打開,用于客戶機(jī)和服務(wù)器之間進(jìn)行通訊,以完成指定性工作。頭文件#define my_fifo my_fifo /*定義頭文件名*/#define file_name server. /*定義頭文件名*/客戶端程序#include#include#include#includefifo_hd.hmain(int argc,char *argv)intfd1,fd2,pid,pid1; /* 定義管道*/charmy_buf100;charm

17、y_fil100;charmy1buf100;if(fd1=open(my_fifo,1)=-1)fprintf(stderr,Open well_known FIFO for readind Error!n);exit(-1); /*失敗*/ fprintf(stderr,Open %s OK!n,my_fifo);pid=getpid();sprintf(my_buf,%5.5d%6.6d%7.7d,pid,pid*10,pid*20);if(write(fd1,my_buf,20)!=0)strcpy(my_fil,file_name); /*拷貝*/strncat(my_fil,my_

18、buf,5);fprintf(stderr,Send_fil: %sn,my_fil);sleep(2);if(fd2=open(my_fil,2)=-1)fprintf(stderr,open %s Error!n,my_fil);close(fd1);exit(-2);fprintf(stderr,open %s OK!n,my_fil);if(read(fd2,my1buf,5)!=0)my1buf5=0;fprintf(stderr,Read from my_buf:%s!ntmy1buf:%s,my_buf,my1buf);if(strncmp(my_buf,my1buf,5)!=0

19、)fprintf(stderr,Different occurs!n);strcpy(my_buf,0000000000);write(fd2,my_buf,5);/sleep(5);close(fd2);close(fd1);服務(wù)器程序#include#include#include#include#includefifo_hd.hvoidterminate();intwell_known_id,tmp_id;chartmp_fil100;main(int argc,char *argv)intfd1,fd2;pid_tpid;charmy_buf100,my_fil100,my_tmp10

20、0;sprintf(my_buf,rm -f %s /dev/null,my_fifo);system(my_buf);/do shell cmd rm -f my_fifo /dev/nullwell_known_id=tmp_id=-1;signal(SIGINT,terminate);if(mkfifo(my_fifo,S_IRWXU|S_IRWXG|S_IRWXO)=-1)fprintf(stderr,Create Well_known FIOF Error!n);exit(-1); /*創(chuàng)建失敗*/fprintf(stderr,mkfifo OK!n);fprintf(stderr,

21、A New Seession! Im waiting connection.n);loop1: /*輸出字符串*/if(fd1=open(my_fifo,0)=-1)fprintf(stderr,Open well_known FIFO for readind Error!n);unlink(my_fifo); /*斷鏈接*/exit(-2); well_known_id=fd1;tmp_id=-1;fprintf(stderr,open my_fifo OK!n);if(read(fd1,my_buf,20)!=0)fprintf(stderr,My_buff=%sn,my_buf);str

22、cpy(my_fil,file_name);strncat(my_fil,my_buf,5);strcpy(tmp_fil,my_fil);if(pid=fork()!=0)close(fd1);wait();goto loop1;fprintf(stderr,Tmp_FIFO is: %s|n,my_fil);if(mkfifo(my_fil,S_IRWXU|S_IRWXG|S_IRWXO)=-1)fprintf(stderr,Create my_fil:%s FIFO Error!n,my_fil);exit(-1); /*錯(cuò)誤*/ /system(ls server*);if(fd2=o

23、pen(my_fil,2)=-1)fprintf(stderr,Open %s Error!:%dn,my_fil,fd2);close(fd1); unlink(my_fifo);exit(-3);tmp_id=fd2;if(write(fd2,my_buf,5)!=5)fprintf(stderr,Write %s Error!n,my_fil);close(fd2); close(fd1);unlink(my_fil); unlink(my_fifo);exit(-4); /*退出*/sleep(1);if(read(fd2,my_tmp,5)!=5)fprintf(stderr,rea

24、d %s Error!n,my_fil);close(fd2); close(fd1);unlink(my_fil); unlink(my_fifo);exit(-5); /*退出*/else if(strncmp(my_tmp,00000,5)!=0)close(fd2);close(fd1);fprintf(stderr,Filed to finish talking with %s!n,my_fil);unlink(my_fil);exit(-1); /*失敗*/goto loop1;elseclose(fd2);close(fd1);fprintf(stderr,OK to talki

25、ng with %s!n,my_fil);unlink(my_fil);/unlink(my_fifo);exit(0); /*成功實(shí)現(xiàn)管道通信*/void terminate()if(well_known_id!=-1)close(well_known_id); unlink(my_fifo);if(tmp_id!=-1)close(tmp_id);unlink(tmp_fil);fprintf(stderr,The Server Program stoped by Signal:SIGINT!n);exit(0);七、調(diào)試與測(cè)試任務(wù)一編譯方法: 編譯:cc liulong.c執(zhí)行:./a.

26、out結(jié)果:任務(wù)二編譯方法是:編譯:cc o fifo_svr fifo_srv.ccc o fifo_clt fifo_client.c執(zhí)行:先啟動(dòng)server端程序,方法為:./fifo_svr服務(wù)端:再換一個(gè)終端運(yùn)行client端,方法是:./fifo_clt客戶端:運(yùn)行時(shí),client只運(yùn)行一次就將退出,而server端作為服務(wù)器仍將繼續(xù)運(yùn)行,你再次啟動(dòng)client來請(qǐng)求服務(wù)。正常:管道實(shí)現(xiàn)通信出現(xiàn)錯(cuò)誤如下:服務(wù)器運(yùn)行起初正常,然后當(dāng)與客戶端建立通信時(shí)由于客戶端程序出錯(cuò),導(dǎo)致整個(gè)通信出現(xiàn)錯(cuò)誤。 由客戶端引起的服務(wù)器程序運(yùn)行出現(xiàn)錯(cuò)誤當(dāng)服務(wù)器輸送文件時(shí),打開服務(wù)器出現(xiàn)錯(cuò)誤繼續(xù)結(jié)果一樣:客戶

27、端程序運(yùn)行出現(xiàn)錯(cuò)誤服務(wù)器等待通信連接: 服務(wù)器程序正常運(yùn)行八、設(shè)計(jì)中遇到的問題及解決方法 在編寫無名管道前了解到pipe()創(chuàng)建的管道只能實(shí)現(xiàn)父子進(jìn)程或者兄弟進(jìn)程之間的通信,但是還是遇到了以下幾個(gè)問題:1、 怎樣實(shí)現(xiàn)不同子進(jìn)程互斥的訪問管道?2、是各個(gè)子進(jìn)程都寫完之后父進(jìn)程一起讀,還是在每個(gè)子進(jìn)程一寫完父進(jìn)程就馬上讀,那么怎樣去通知父進(jìn)程去讀呢?經(jīng)過查閱相關(guān)資料得知,為解決第一個(gè)問題而引入了lockf()函數(shù)用于實(shí)現(xiàn)上鎖與解鎖,此函數(shù)放在讀寫之前執(zhí)行。為解決第二問題而引入sleep()和wait()函數(shù)用以實(shí)現(xiàn)睡眠與等待。 在編寫有名管道前經(jīng)查閱相關(guān)資料得知用mknod()或者mkfifo()

28、函數(shù)調(diào)用創(chuàng)建有名管道從而實(shí)現(xiàn)在任意兩個(gè)文件間的通信,該管道可以像普通文件一樣read、write、open。由于這是個(gè)新接觸的知識(shí),以往沒有練習(xí)過,所以出現(xiàn)的問題較多:首先,怎樣才能實(shí)現(xiàn)客戶/服務(wù)器模式,使其可在兩個(gè)終端上交互運(yùn)行? 其次,怎樣控制讀寫以及輸入輸出?經(jīng)過查閱相關(guān)資料模仿、拷貝、小組討論即可得出基本模塊。最后使用signal(SIGINT,terminate)函數(shù)發(fā)送中斷信號(hào)退出程序。經(jīng)調(diào)試后最后可在機(jī)器上運(yùn)行。九、源程序清單#include #include #include int pid1,pid2; main( ) int fd2;char outpipe100,inpi

29、pe100;pipe(fd); while (pid1=fork( )=-1);if(pid1=0) lockf(fd1,1,0); sprintf(outpipe,child 1 process is sending message!); write(fd1,outpipe,50); sleep(5); lockf(fd1,0,0); exit(0); else while(pid2=fork( )=-1); if(pid2=0) lockf(fd1,1,0); sprintf(outpipe,child 2 process is sending message!); write(fd1,o

30、utpipe,50); sleep(5); lockf(fd1,0,0); exit(0); else wait(0); read(fd0,inpipe,50); printf(%sn,inpipe); wait(0); read(fd0,inpipe,50); printf(%sn,inpipe); exit(0); 頭文件:#define my_fifo my_fifo#define file_name server.客戶端程序:#include#include#include#includefifo_hd.hmain(int argc,char *argv)intfd1,fd2,pid,

31、pid1;charmy_buf100;charmy_fil100;charmy1buf100;if(fd1=open(my_fifo,1)=-1)fprintf(stderr,Open well_known FIFO for readind Error!n);exit(-1); fprintf(stderr,Open %s OK!n,my_fifo);pid=getpid();sprintf(my_buf,%5.5d%6.6d%7.7d,pid,pid*10,pid*20);if(write(fd1,my_buf,20)!=0)strcpy(my_fil,file_name);strncat(

32、my_fil,my_buf,5);fprintf(stderr,Send_fil: %sn,my_fil);sleep(2);if(fd2=open(my_fil,2)=-1)fprintf(stderr,open %s Error!n,my_fil);close(fd1);exit(-2);fprintf(stderr,open %s OK!n,my_fil);if(read(fd2,my1buf,5)!=0)my1buf5=0;fprintf(stderr,Read from my_buf:%s!ntmy1buf:%s,my_buf,my1buf);if(strncmp(my_buf,my

33、1buf,5)!=0)fprintf(stderr,Different occurs!n);strcpy(my_buf,0000000000);write(fd2,my_buf,5);/sleep(5);close(fd2);close(fd1);服務(wù)器程序:#include#include#include#include#includefifo_hd.hvoidterminate();intwell_known_id,tmp_id;chartmp_fil100;main(int argc,char *argv)intfd1,fd2;pid_tpid;charmy_buf100,my_fil1

34、00,my_tmp100;sprintf(my_buf,rm -f %s /dev/null,my_fifo);system(my_buf);/do shell cmd rm -f my_fifo /dev/nullwell_known_id=tmp_id=-1;signal(SIGINT,terminate);if(mkfifo(my_fifo,S_IRWXU|S_IRWXG|S_IRWXO)=-1)fprintf(stderr,Create Well_known FIOF Error!n);exit(-1);fprintf(stderr,mkfifo OK!n);fprintf(stder

35、r,A New Seession! Im waiting connection.n);loop1:if(fd1=open(my_fifo,0)=-1)fprintf(stderr,Open well_known FIFO for readind Error!n);unlink(my_fifo);exit(-2); well_known_id=fd1;tmp_id=-1;fprintf(stderr,open my_fifo OK!n);if(read(fd1,my_buf,20)!=0)fprintf(stderr,My_buff=%sn,my_buf);strcpy(my_fil,file_

36、name);strncat(my_fil,my_buf,5);strcpy(tmp_fil,my_fil);if(pid=fork()!=0)close(fd1);wait();goto loop1;fprintf(stderr,Tmp_FIFO is: %s|n,my_fil);if(mkfifo(my_fil,S_IRWXU|S_IRWXG|S_IRWXO)=-1)fprintf(stderr,Create my_fil:%s FIFO Error!n,my_fil);exit(-1); /system(ls server*);if(fd2=open(my_fil,2)=-1)fprintf(stderr,Open %s Error!:%dn,my_fil,fd2);close(fd1); unlink(my_fifo);exit(-3);tmp_id=fd2;if(write(fd2,my_buf,5)!=5)fprintf(stderr,Write %s Error!n,my_fil);close(fd2); close(fd1);unlink(my_fil); unlink(my_fifo);exit(-4);sl

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論