Linux實驗報告 (2)

上傳人:優(yōu)*** 文檔編號:49650386 上傳時間:2022-01-18 格式:DOC 頁數(shù):26 大?。?56.50KB
收藏 版權(quán)申訴 舉報 下載
Linux實驗報告 (2)_第1頁
第1頁 / 共26頁
Linux實驗報告 (2)_第2頁
第2頁 / 共26頁
Linux實驗報告 (2)_第3頁
第3頁 / 共26頁

下載文檔到電腦,查找使用更方便

20 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《Linux實驗報告 (2)》由會員分享,可在線閱讀,更多相關(guān)《Linux實驗報告 (2)(26頁珍藏版)》請在裝配圖網(wǎng)上搜索。

1、真誠為您提供優(yōu)質(zhì)參考資料,若有不當之處,請指正。 Linux實驗報告 姓 名 黃芳愷 班 級 軟件工程114 學(xué) 號 119074258 指導(dǎo)教師 阮越

2、 目錄 實驗一 Linux基本命令的使用 實驗二 簡單Shell程序設(shè)計 實驗三 Linux下簡單C程序設(shè)計與文件操作 實驗四 Linux下進程操作與進程間通信 實驗五 Linux線程的使用

3、 實驗六 Linux進程間的IPC 實驗七 Linux下訪問Mysql數(shù)據(jù)庫 實驗八 Linux下網(wǎng)絡(luò)編程 練習(xí)題:grep、bash、生產(chǎn)者消費者 實驗一 Linux基本命令的使用 1、實驗?zāi)康? 學(xué)習(xí)和掌握Linux的基本命令。 2、實驗內(nèi)容和步驟 步驟1:以user_login用戶身份并使用telnet登錄Linux服務(wù)器,按照提示創(chuàng)建自己的賬戶和口令。 步驟 2:使用新創(chuàng)建的用戶賬戶和口令登錄Linux系統(tǒng),察看登錄后的界面。

4、 步驟3:使用pwd命令察看當前的工作目錄,然后用ls命令查看當前目錄下的內(nèi)容,嘗試使用-a,-l,-F,-A,-lF等不同選項并比較不同之處。? -a do not ignore entries starting with -I, --ignore=PATTERN do not list implied entries matching shell PATTERN -l use a long listing format -F, --classify append indicator (one of */=>@|) to e

5、ntries -A, --almost-all do not list implied . and .. -lF ignore file 步驟4:在當前目錄下建立一個名為test的新目錄,然后將工作目錄切換到test下,嘗試將/etc目錄下的文件passwd拷貝到該目錄下(cp 源文件 目的目錄)。察看當前目錄下的passwd文件的屬主和文件權(quán)限。 步驟5:嘗試向當前目錄下的passwd文件和/etc/passwd文件分別寫入一些新內(nèi)容(可使用echo “字符串” >>文件的命令),看看操作能否成功,如果不能成功,請說明

6、原因。用cat命令瀏覽文件password的內(nèi)容,用more命令進行瀏覽翻頁操作,再用less命令瀏覽文件的內(nèi)容。比較這幾個命令的不同之處 對當前目錄中成功,因為該目錄下的passwd文件對當前用戶具有寫的權(quán)限。對/etc/passwd文件的操作被拒絕因為對當前用戶不具有寫的權(quán)限 cat命令將文件的內(nèi)容全部顯示,more命令將文件內(nèi)容分屏顯示,less命令進行刷新的全部顯示 步驟6:用ls命令查看test下文件的權(quán)限,用mv命令更改文件password的文件名為test.txt,嘗試用chown和chgrp更改文件的屬主為root、組為root,看看能否成功,不成功,請說明原因。嘗試

7、用chomd將文件權(quán)限為“-rw-------”??纯茨芊癯晒?,不成功,請說明原因。 用chown和chgrp更改文件的屬主為root、組為root,不成功。因為chown和chgrp一般是root的權(quán)限 步驟7:用rm命令刪除test目錄下的所有文件,再用rmdir命令刪除test目錄。?(想一想有沒有一條命令將目錄及目錄下的所有文件刪除,寫出這條命令) rm -rf test 步驟8:使用ps命令查看當前系統(tǒng)內(nèi)的進程,并利用man命令獲取ps命令的參數(shù),寫出獲取當前終端進程執(zhí)行情況的ps命令。 步驟9:使用df命令查看當前系統(tǒng)已安裝的文件系統(tǒng)的空間使用情況,記錄結(jié)果。

8、 步驟10:使用du命令查看用戶的工作目錄占用了多少空間,記錄結(jié)果。 步驟11:使用free命令查看內(nèi)存資源的使用情況,記錄結(jié)果。 步驟12:使用man獲取tar和gzip的幫助信息,嘗試將test目錄下的文件打包并壓縮,然后到另外一目錄tmp下解包,寫出這幾條命令。 步驟13:嘗試執(zhí)行“l(fā)s –l > tmp”,看看這條命令的執(zhí)行會出現(xiàn)什么結(jié)果,解釋一下這條命令。 創(chuàng)建一個名為tmp的文件并將ls -l輸出的內(nèi)容寫入tmp中 步驟14:嘗試執(zhí)行find /usr/src -name *.c -print | xargs grep “#include”,看看這條命令的執(zhí)行會出現(xiàn)

9、什么結(jié)果,解釋一下這條命令。 匹配查找列表輸出/usr/src下以.c結(jié)尾的文件中含有“#include”的內(nèi)容 步驟15:執(zhí)行cal和date命令,說說這兩條指令的用途。 步驟16:執(zhí)行命令clear和logout,退出系統(tǒng)。(想一想有沒有其他的方法,寫出這種方法) Exit 步驟17:執(zhí)行命令shutdown,關(guān)閉系統(tǒng)。(想一想有沒有更簡單的命令,寫出這條命令) Init 0 3、實驗結(jié)論 通過對linux 的常用命令的學(xué)習(xí),讓我對linux的系統(tǒng)有了初步的認識--這是一個完全基于命令操作的操作系統(tǒng),這些命令組成了強大的命令系統(tǒng),提供了完善的功能。這些命令操作將為我以后

10、的linux學(xué)習(xí)打下良好的基礎(chǔ)。 實驗二 簡單Shell程序設(shè)計 ?1、實驗?zāi)康? (1) 學(xué)習(xí)和掌握vi編輯器的基本使用方法。 (2) 學(xué)習(xí)和掌握編寫簡單的shell程序。 2、實驗內(nèi)容和步驟 2.1 vi的使用 步驟1:以root用戶身份登錄進入Linux?系統(tǒng)。 步驟 2:啟動Vi,切換到輸入模式,輸入一段英文: This?ia?an?exercise! We?use?Vi?to?edit?it.? Left,down,up,right? 步驟3:嘗試匹配其中的一串字符,寫出這命令及執(zhí)行結(jié)果。 :/Left 步驟4:嘗試替換其中的一串字符,寫出這命令及執(zhí)行

11、結(jié)果。 :3s/Left/123/g 步驟5:嘗試復(fù)制/刪除其中的一行或幾行文本,寫出命令及執(zhí)行結(jié)果。 命令模式下,光標移動到那一行按”[n]yy”(n為要復(fù)制的行數(shù))再按p粘貼。 命令模式下,光標移動到那一行按”[n]dd”(n為要刪除的行數(shù))刪除一行或幾行。 步驟6:嘗試復(fù)制/刪除其中的一個單詞或幾個字符,寫出命令及執(zhí)行結(jié)果。 命令模式下,光標移動到那一行按”[n]yw”(n為要復(fù)制的單詞數(shù))再按p粘貼。 命令模式下,光標移動到那一行按”[n]dw”(n為要刪除的單詞數(shù))刪除一個或幾個字符。 步驟7:嘗試使用鼠標復(fù)制文本,寫出命令及執(zhí)行結(jié)果。 直接使用鼠標選中復(fù)制,將光標

12、移動到要粘貼的地方用鼠標粘貼即可完成復(fù)制文本。 步驟8:嘗試存盤退出操作,寫出命令。 :wq 2.2 簡單的shell程序 步驟1:使用Vi將程序清單2-1的程序輸入。 步驟 2:嘗試運行該程序,如果不能運行,原因是什么,怎樣修改。 沒有執(zhí)行權(quán)限 chmod +x test 步驟3:執(zhí)行程序,寫出程序的執(zhí)行結(jié)果。 步驟4:閱讀程序,掌握shell函數(shù)的編寫方法,補全函數(shù)file_run。 file_run() { ls -l | awk '/^-(..x)+/ {print $9}' } 步驟5:修改程序中的函數(shù)uers(),使得顯示在線用戶時不分行。(

13、提示:可以使用循環(huán),對每個在線用戶分別處理。) uers() { echo "there are `who|wc -l` users online" echo "who are" for i in $(who | awk '{print $1}');do printf "%s " $i done echo } 3、實驗結(jié)論 Linux系統(tǒng)shell編程其本質(zhì)就是linux命令的組合,通過許多簡單命令的組合可以完成很多功能,可以開發(fā)一些小型程序。 實驗三 Linux下簡單C程序設(shè)計與文件操作 1、實驗?zāi)康? (3) 學(xué)習(xí)和掌握gcc等Linux的開發(fā)調(diào)

14、試環(huán)境。 (4) 學(xué)習(xí)并掌握Linux的文件操作。 (5) 編寫并實現(xiàn)實驗步驟6要求的程序。 2、實驗內(nèi)容和步驟 步驟1:使用Vi將程序清單3-1和3-2的程序輸入,并在當前目錄下創(chuàng)建文件“file.in”和文件“file.out”,盡可能的使文件“file.in”大一些。 步驟 2:利用gcc分別編譯這兩個程序,寫出編譯命令和執(zhí)行結(jié)果,如果不成功,嘗試利用gdb調(diào)試。 gcc –o list3_1 list3_1.c gcc –o list3_2 list3_2.c 步驟3:仔細觀察這兩個程序,比較標準C的文件操作和Linux的系統(tǒng)調(diào)用open、read、write等的使用區(qū)

15、別。 答:標準c的文件操作一個是庫函數(shù)的調(diào)用,linux中系統(tǒng)調(diào)用文件操是底層的文件調(diào)用,其運行效率略有差距,同時參數(shù)也不同,返回的數(shù)據(jù)類型也不同。 步驟4:按照說明重新修改程序3-2,并使用time命令察看程序執(zhí)行的時間效率上有何區(qū)別。 步驟5:輸入、編譯并運行程序3-3和3-4,寫出執(zhí)行結(jié)果,并比較他們fseek和lseek在使用方法上的異同 兩者都是對文件的讀寫指針進行設(shè)置但兩者的返回類型不同,fseek返回的是int型lseek返回的是off_t型 步驟6:學(xué)習(xí)并分別使用標準C的文件操作函數(shù)和Linux的系統(tǒng)調(diào)用創(chuàng)建一個對學(xué)生基本信息進行操作(插入

16、、修改和刪除)的C程序,學(xué)生基本信息以結(jié)構(gòu)體的形式存儲在文件stu.info中,struct stu_info的定義如下: struct stu_info { char stu_num[12]; char name[10]; short int sex;/*0為女生,1為男生*/ char mobile_phone[12]; }; 3、實驗結(jié)論 通過對文件操作的編程,讓我掌握了文件的創(chuàng)建,打開,讀寫,以及特定位置的讀寫關(guān)閉等操作。并且從系統(tǒng)底層調(diào)用和標準c函數(shù)庫兩個角度對文件的操作比較中,認識到兩者的異同。 實驗四 Linux下進程操作與進程間通信 1、實驗?zāi)康?

17、 (1) 學(xué)習(xí)和掌握fork等系統(tǒng)調(diào)用的基本使用方法。 (2) 利用Linux中的管道實現(xiàn)父子進程間的同步。 2、實驗內(nèi)容與步驟 步驟1:使用Vi將程序清單4-1的程序輸入、編譯并運行,學(xué)習(xí)和掌握fork的基本調(diào)用方法。 步驟 2:使用Vi將程序清單4-2、4-3和4-4的程序輸入、利用gcc分別編譯這三個程序,寫出編譯命令和編譯結(jié)果,如果不成功,嘗試利用gdb調(diào)試。 gcc -o list4_2 list4_2.c gcc -o father father.c gcc -o child child.c 步驟3:寫出編譯這三個程序的makefile,然后利用make進行編譯,談

18、談這么做的好處。 可以節(jié)省勞動時間,讓三個程序同時編譯,簡化了操作。 步驟4:運行這三個程序,寫出運行結(jié)果。 步驟5:屏幕上顯示出的執(zhí)行結(jié)果是哪一個進程執(zhí)行的結(jié)果? father和child 步驟6:父進程中的printf有向屏幕輸出嗎?為什么? 沒有,因為父進程的標準輸出已經(jīng)被重定向。 步驟7:利用父子進程間的管道通信方式,改寫實驗3步驟6要求的程序。 3、實驗結(jié)論 通過該節(jié)實驗,我更進一步理解了fock函數(shù)dup函數(shù)exercl函數(shù)的工作原理,讓我了解到了進程并發(fā)的概念。學(xué)習(xí)了如何創(chuàng)建子進程,進程映象替換,以及通過無名管道實現(xiàn)父子進程中的輸入輸出重定向 實驗五

19、 Linux線程的使用 1、實驗?zāi)康? 學(xué)習(xí)和掌握Linux線程的創(chuàng)建以及同步方法。 2、實驗內(nèi)容和步驟 步驟1:輸入程序5-1,編譯并運行寫出執(zhí)行結(jié)果。 thread_function is running.Argument was 10 Waiting for thread to finish... Thread joined,it returned Thank you for the CPU time share_int is now -10 步驟 2:仔細研讀代碼,描述pthread_create函數(shù)中各個參數(shù)的意義,并給出線程的入口函數(shù)的調(diào)用方法,描述兩線程間參數(shù)傳

20、遞的方式。 該函數(shù)有四個參數(shù),第一個參數(shù)為一個指向pthread_t類型數(shù)據(jù)的指針,第二個參數(shù)為創(chuàng)建線程的屬性,一般用NULL表示用默認屬性,第三個參數(shù)為指向要調(diào)用函數(shù)的函數(shù)指針,第四個參數(shù)是傳給該函數(shù)的參數(shù)。 參數(shù)傳遞方式: 首先線程的函數(shù)要定義成void *(*start_routine)(void*)的形式,主線程創(chuàng)建子線程時可將要傳給子線程的信息放在pthead_create函數(shù)的第四個參數(shù)上,子線程創(chuàng)建后就可以通過函數(shù)的參數(shù)直接獲得(為一個void類型的指針)。 步驟3:打開注釋掉的全局變量aa及操作aa的相關(guān)代碼,回答這跟進程有什么不同。 由于線程是共享進程內(nèi)資源的,所以

21、子線程如果改變了aa的值,主線程內(nèi)aa的值也會發(fā)生改變,而如果是創(chuàng)建了一個子進程,若子進程改變了aa的值,主進程內(nèi)aa的值是沒有發(fā)生改變的。 步驟4:輸入程序5-2,編譯并運行,寫出運行結(jié)果。 Input some text,Enter 'end' to finish basjk You input 5 characters end Waiting for thread to finish... Thread joined 步驟5:仔細研讀代碼,描述利用信號量實現(xiàn)線程間同步調(diào)用方法。 定義一個全局的sem_t類型的變量,通過函數(shù)sem_init(&bin_sem,0,0)

22、初始化信號量,sem_wait函數(shù)相當于P操作,sem_post函數(shù)相當于V操作,改程序的實質(zhì)其實是一個生產(chǎn)者消費者問題。 注: int sem_init(sem_t *sem, int pshared, unsigned int value); The value argument specifies the initial value for the semaphore. If pshared has the value 0, then the semaphore is shared between the threads of a process. If pshared is

23、nonzero, then the semaphore is shared between processes. 步驟6:學(xué)習(xí)并使用線程間的同步方法,重新改寫實驗3步驟6要求的程序。要求啟用兩個線程,其中主線程接受用戶對文件stu.info的操作命令然后發(fā)給子線程,子線程完成對文件的實際操作(注意線程間的同步)。 3、實驗結(jié)論 通過本節(jié)實驗學(xué)習(xí)了如何創(chuàng)建線程,如何在線程之間傳遞參數(shù)已經(jīng)共享數(shù)據(jù),以及如何利用信號量同步線程。如何在線程之間傳遞參數(shù)已經(jīng)共享數(shù)據(jù),以及如何利用信號量同步線程。 實驗六 Linux進程間的IPC 1、實驗?zāi)康? 學(xué)習(xí)和掌握Linux進程間的I

24、PC及同步方法。 2、實驗內(nèi)容和步驟 步驟1:輸入程序6-1,6-2編譯并運行寫出執(zhí)行結(jié)果。 步驟 2:仔細研讀代碼,寫出程序中實現(xiàn)P、V操作的相關(guān)函數(shù)和代碼,描述程序的同步工作過程。 上述代碼實現(xiàn)多個進程讀寫臨界區(qū)時,使用信號量進行同步的例子,讀臨界區(qū)時先P操作,出臨界后V操作,上面結(jié)果中O與X的出現(xiàn)都是成隊的。 步驟3:輸入程序6-3和6-4,編譯執(zhí)行并寫出結(jié)果。 步驟4:程序6-3和6-4中哪段代碼實現(xiàn)了共享,描述實現(xiàn)內(nèi)存共享的主要函數(shù)的參數(shù)意義和這些函數(shù)的使用方法。 int shmget(key_t key, size_t size, int shmflg); //

25、向系統(tǒng)申請一塊共享內(nèi)存 void *shmat(int shmid, const void *shmaddr, int shmflg); //將共享內(nèi)存掛載到shmaddr指針上 int shmdt(const void *shmaddr); //卸載共享內(nèi)存 int shmctl(int shmid, int cmd, struct shmid_ds *buf); //刪除共享內(nèi)存以及其他控制 shmctl(shmid, IPC_RMID, 0); 步驟5:學(xué)習(xí)并使用IPC中信號量和共享內(nèi)存的使用方法,重新改寫實驗3步驟6要求的程序。要求啟動多個進程,每一個進程都可以單

26、獨對文件進行操作,進程間通過信號量進行同步,對文件的操作映射到共享內(nèi)存中。 3、 實驗結(jié)論 通過對改節(jié)實驗,讓我了解了進程IPC信號量訪問臨界區(qū),以及進程之間訪問共享內(nèi)存的實現(xiàn)方法和同步機制,掌握了上述一系列函數(shù)的使用方法。IPC用于完成進程間通信,包括信號量,共享內(nèi)存已及消息隊列,在編寫linux程序時非有用 實驗七 Linux下訪問Mysql數(shù)據(jù)庫 1、實驗?zāi)康? 學(xué)習(xí)和掌握Mysql數(shù)據(jù)庫及編程訪問方法。 2、實驗內(nèi)容和步驟 步驟1:在Mysql中使用sql命令create database foo命令創(chuàng)建數(shù)據(jù)庫foo。 步驟 2:在數(shù)據(jù)庫foo中創(chuàng)建表child

27、ren。 create table children ( childno int(11) not null auto_increment, fname varchar(30), age int(11), primary key (childno) ); 步驟3:向表children中插入若干記錄。 insert into children values (1,’Jenny’,17); Insert into children values (2,’Andrew’,13); Insert into children values (3,’Alex’,12); Ins

28、ert into children values (4,’Tom’,11); Insert into children values (5,’Jack’,7); Insert into children values (6,’Ella’,14); 步驟4:輸入、編譯并運行程序7-1、7-2和7-3,寫出運行結(jié)果。 步驟5:學(xué)習(xí)并使用C語言訪問Mysql的基本方法,重新改寫實驗3步驟6要求的程序。要求使用數(shù)據(jù)庫保存stu.info結(jié)構(gòu)。 3、實驗結(jié)論 通過mysql.h C語言可以使用數(shù)據(jù)庫。通過該節(jié)實驗我掌握了linux下怎么用c語言進行簡單的數(shù)據(jù)庫方面的編程。

29、 實驗八 Linux下網(wǎng)絡(luò)編程 1、實驗?zāi)康? 學(xué)習(xí)和掌握socket函數(shù)的基本使用方法。 2、實驗內(nèi)容和步驟 步驟1:輸入、編譯并運行程序8-1和8-2,寫出程序的執(zhí)行結(jié)果。 步驟 2:學(xué)習(xí)并使用socket函數(shù)的基本使用方法,完善并重新改寫前幾個實驗實現(xiàn)的程序。要求用戶在客戶端實現(xiàn)數(shù)據(jù)操作請求的輸入,然后上傳到服務(wù)器端完成對數(shù)據(jù)庫的實際操作。同學(xué)在實現(xiàn)時應(yīng)盡可能的使用前幾個實驗的成果,即應(yīng)該包括多線程或多進程、數(shù)據(jù)庫以及socket等。 3、實驗結(jié)論 通過改節(jié)實驗我掌握了linux下用c語言進行網(wǎng)絡(luò)編程。socket可以實現(xiàn)不同主機間進程的通信,可以編寫出網(wǎng)絡(luò)應(yīng)用程序

30、 課堂練習(xí): 1. grep: #include #include int main(int argc,char** argv) { FILE *fp; char tmp[100],c; char* tmp1; int l = 0,line = 1; if(argc<3) { printf("input wrong!\n"); return 0; } if(!(fp=fopen(argv[2],"r"))) { printf("can't open file!\

31、n"); return 0; } fscanf(fp,"%c",&c); NEW_LINE: while(c!='\n'&&!feof(fp)) { tmp[l]=c; l++; fscanf(fp,"%c",&c); } tmp[l]=0; tmp1 = tmp; while(l!=0) { if(!strncmp(argv[1],tmp1,sizeof(argv[1]))) { printf("line %d: %s\n",line,tmp); } l--; tmp1+=siz

32、eof(char); } fscanf(fp,"%c",&c); line++; if(!feof(fp)) goto NEW_LINE; return 1; } 運行結(jié)果: 2. bash: #include #include #include #include #include void main() { pid_t pid; char arg[100]; char **parg,**p; in

33、t lenth,i,j; printf("mysh#"); while(1) { j=0; fgets(arg,sizeof(arg),stdin); //fgets比gets多接收一個LF(換行)即\n //gets(arg); if(!strcmp(arg,"exit\n")) return; pid = fork(); if(pid==0) { lenth=strlen(arg); lenth--; arg[lenth]=0; //printf("%s\n",arg); //pri

34、ntf("%d\n",arg[2]); //printf("%d\n",lenth); if(lenth==0) return; parg=(char**)malloc(sizeof(char**)); *(parg+j)=arg; j++; for(i=0;i

35、(arg+i+1); j++; } } //printf("%s %s %s",parg[0],parg[1],parg[2]); execvp(*parg,parg); } else { wait(0); printf("mysh#"); } } } 運行結(jié)果: 3.生產(chǎn)者消費者: //semaphore&sharememory.c #include #include #include #inclu

36、de #include #include #include #define TEXT_SZ 2048 struct shared_use_st { char some_text[TEXT_SZ]; }; union semun { int val; struct semid_ds *buf; unsigned short int *array; struct seminf

37、o *__buf; }; static int set_semvalue(int val,int th); static void del_semvalue(int th); static int semaphore_p(int th); static int semaphore_v(int th); static int sem_id; int main() { int running = 1; void *shared_memory = (void *)0; struct shared_use_st *shared_st

38、uff; int shmid; sem_id = semget((key_t)1234, 2, 0666 | IPC_CREAT); set_semvalue(1,0); set_semvalue(0,1); srand((unsigned int)getpid()); shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666 | IPC_CREAT); if (shmid == -1) { fprintf(stderr, "shmget faile

39、d\n"); exit(EXIT_FAILURE); } shared_memory = shmat(shmid, (void *)0, 0); if (shared_memory == (void *)-1) { fprintf(stderr, "shmat failed\n"); exit(EXIT_FAILURE); } printf("Memory attached at %X\n", (int)shared_memory); shared_stuff = (struct

40、shared_use_st *)shared_memory; while(running) { semaphore_p(1); printf("You wrote: %s", shared_stuff->some_text); sleep( rand() % 4 ); if (strncmp(shared_stuff->some_text, "end", 3) == 0) { running = 0; }

41、semaphore_v(0); } if (shmdt(shared_memory) == -1) { fprintf(stderr, "shmdt failed\n"); exit(EXIT_FAILURE); } if (shmctl(shmid, IPC_RMID, 0) == -1) { fprintf(stderr, "shmctl(IPC_RMID) failed\n"); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS

42、); } static int set_semvalue(int val,int th) { union semun sem_union; sem_union.val = val; if (semctl(sem_id, th, SETVAL, sem_union) == -1) return(0); return(1); } static void del_semvalue(int th) { union semun sem_union; if (semctl(sem_id, th, IPC_RMI

43、D, sem_union) == -1) fprintf(stderr, "Failed to delete semaphore\n"); } static int semaphore_p(int th) { struct sembuf sem_b; sem_b.sem_num = th; sem_b.sem_op = -1; sem_b.sem_flg = SEM_UNDO; if (semop(sem_id, &sem_b, 1) == -1) { fprintf(stderr, "

44、semaphore_p failed\n"); return(0); } return(1); } static int semaphore_v(int th) { struct sembuf sem_b; sem_b.sem_num = th; sem_b.sem_op = 1; sem_b.sem_flg = SEM_UNDO; if (semop(sem_id, &sem_b, 1) == -1) { fprintf(stderr, "semaphore_v

45、failed\n"); return(0); } return(1); } //semaphore&sharememory1.c #include #include #include #include #include #include #include #define TEXT_SZ 2048 struct shared_use_st { char so

46、me_text[TEXT_SZ]; }; union semun { int val; struct semid_ds *buf; unsigned short int *array; struct seminfo *__buf; }; static int set_semvalue(int val,int th); static void del_semvalue(int th); static int semaphore_p(int th); static i

47、nt semaphore_v(int th); static int sem_id; int main() { int running = 1; void *shared_memory = (void *)0; struct shared_use_st *shared_stuff; char buffer[BUFSIZ]; int shmid; sem_id = semget((key_t)1234, 2, 0666 | IPC_CREAT); shmid = shmget((key_t)1234, sizeof(s

48、truct shared_use_st), 0666 | IPC_CREAT); if (shmid == -1) { fprintf(stderr, "shmget failed\n"); exit(EXIT_FAILURE); } shared_memory = shmat(shmid, (void *)0, 0); if (shared_memory == (void *)-1) { fprintf(stderr, "shmat failed\n"); exit(EXIT_FA

49、ILURE); } printf("Memory attached at %X\n", (int)shared_memory); shared_stuff = (struct shared_use_st *)shared_memory; while(running) { printf("Enter some text: "); fgets(buffer, BUFSIZ, stdin); semaphore_p(0); strncpy(shared_stuff->some_text,

50、buffer, TEXT_SZ); semaphore_v(1); if (strncmp(buffer, "end", 3) == 0) { running = 0; } } if (shmdt(shared_memory) == -1) { fprintf(stderr, "shmdt failed\n"); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); } static int set_semv

51、alue(int val,int th) { union semun sem_union; sem_union.val = val; if (semctl(sem_id, th, SETVAL, sem_union) == -1) return(0); return(1); } static void del_semvalue(int th) { union semun sem_union; if (semctl(sem_id, th, IPC_RMID, sem_union) == -1)

52、 fprintf(stderr, "Failed to delete semaphore\n"); } static int semaphore_p(int th) { struct sembuf sem_b; sem_b.sem_num = th; sem_b.sem_op = -1; sem_b.sem_flg = SEM_UNDO; if (semop(sem_id, &sem_b, 1) == -1) { fprintf(stderr, "semaphore_p failed\n");

53、 return(0); } return(1); } static int semaphore_v(int th) { struct sembuf sem_b; sem_b.sem_num = th; sem_b.sem_op = 1; sem_b.sem_flg = SEM_UNDO; if (semop(sem_id, &sem_b, 1) == -1) { fprintf(stderr, "semaphore_v failed\n"); return(0); } return(1); } 運行結(jié)果: 26 / 26

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

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!