Linux實驗報告
《Linux實驗報告》由會員分享,可在線閱讀,更多相關(guān)《Linux實驗報告(19頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、- Linu*實驗報告 姓 名 黃芳愷 班 級 軟件工程114 學(xué) 號 119074258 指導(dǎo)教師 阮越 目錄 實驗一 Linu*根本命令的使用 實驗二 簡單Shell程序設(shè)計 實驗三 Linu*下簡單C程序設(shè)計與文件操作 實驗四 Linu*下進程操作與進程間通信 實驗五 Linu*線程的使用 實驗六 Linu*進程間的IPC 實驗七 Linu*下訪問Mysql數(shù)據(jù)庫 實驗八 Linu*下網(wǎng)絡(luò)編程 練習(xí)題:grep、bash、生產(chǎn)者消費者 實驗一 Linu*根本命令的使用 1、實驗?zāi)康? 學(xué)習(xí)和掌握Linu*的根本命令。
2、2、實驗內(nèi)容和步驟 步驟1:以user_login用戶身份并使用telnet登錄Linu*效勞器,按照提示創(chuàng)立自己的賬戶和口令。 步驟 2:使用新創(chuàng)立的用戶賬戶和口令登錄Linu*系統(tǒng),觀察登錄后的界面。 步驟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
3、 -l use a long listing format -F, --classify append indicator (one of */=>|) to entries -A, --almost-all do not list implied . and .. -lF ignore file 步驟4:在當前目錄下建立一個名為test的新目錄,然后將工作目錄切換到test下,嘗試將/etc目錄下的文件passwd拷貝到該目錄下〔cp 源文件 目的目錄〕。觀察當前目錄下的passwd文件的屬主和文件權(quán)限。 步驟5:嘗試
4、向當前目錄下的passwd文件和/etc/passwd文件分別寫入一些新內(nèi)容〔可使用echo "字符串〞 >>文件的命令〕,看看操作能否成功,如果不能成功,請說明原因。用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命令
5、更改文件password的文件名為test.t*t,嘗試用chown和chgrp更改文件的屬主為root、組為root,看看能否成功,不成功,請說明原因。嘗試用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)的進程,并利用m
6、an命令獲取ps命令的參數(shù),寫出獲取當前終端進程執(zhí)行情況的ps命令。 步驟9:使用df命令查看當前系統(tǒng)已安裝的文件系統(tǒng)的空間使用情況,記錄結(jié)果。 步驟10:使用du命令查看用戶的工作目錄占用了多少空間,記錄結(jié)果。 步驟11:使用free命令查看內(nèi)存資源的使用情況,記錄結(jié)果。 步驟12:使用man獲取tar和gzip的幫助信息,嘗試將test目錄下的文件打包并壓縮,然后到另外一目錄tmp下解包,寫出這幾條命令。 步驟13:嘗試執(zhí)行"ls –l > tmp〞,看看這條命令的執(zhí)行會出現(xiàn)什么結(jié)果,解釋一下這條命令。 創(chuàng)立一個名為tmp的文件并將ls -l輸出的內(nèi)容寫入tmp中 步驟14:
7、嘗試執(zhí)行find /usr/src -name *.c -print | *args grep "#include〞,看看這條命令的執(zhí)行會出現(xiàn)什么結(jié)果,解釋一下這條命令。 匹配查找列表輸出/usr/src下以.c結(jié)尾的文件中含有"#include〞的內(nèi)容 步驟15:執(zhí)行cal和date命令,說說這兩條指令的用途。 步驟16:執(zhí)行命令clear和logout,退出系統(tǒng)。〔想一想有沒有其他的方法,寫出這種方法〕 E*it 步驟17:執(zhí)行命令shutdown,關(guān)閉系統(tǒng)?!蚕胍幌胗袥]有更簡單的命令,寫出這條命令〕 Init 0 3、實驗結(jié)論 通過對linu* 的常用命令的學(xué)習(xí),讓我對l
8、inu*的系統(tǒng)有了初步的認識--這是一個完全基于命令操作的操作系統(tǒng),這些命令組成了強大的命令系統(tǒng),提供了完善的功能。這些命令操作將為我以后的linu*學(xué)習(xí)打下良好的根底。 實驗二 簡單Shell程序設(shè)計 1、實驗?zāi)康? (1) 學(xué)習(xí)和掌握vi編輯器的根本使用方法。 (2) 學(xué)習(xí)和掌握編寫簡單的shell程序。 2、實驗內(nèi)容和步驟 2.1 vi的使用 步驟1:以root用戶身份登錄進入Linu*?系統(tǒng)。 步驟 2:啟動Vi,切換到輸入模式,輸入一段英文: This?ia?an?e*ercise! We?use?Vi?to?edit?it.? Left,down,up,righ
9、t? 步驟3:嘗試匹配其中的一串字符,寫出這命令及執(zhí)行結(jié)果。 :/Left 步驟4:嘗試替換其中的一串字符,寫出這命令及執(zhí)行結(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
10、〞(n為要刪除的單詞數(shù))刪除一個或幾個字符。 步驟7:嘗試使用鼠標復(fù)制文本,寫出命令及執(zhí)行結(jié)果。 直接使用鼠標選中復(fù)制,將光標移動到要粘貼的地方用鼠標粘貼即可完成復(fù)制文本。 步驟8:嘗試存盤退出操作,寫出命令。 :wq 2.2 簡單的shell程序 步驟1:使用Vi將程序清單2-1的程序輸入。 步驟 2:嘗試運行該程序,如果不能運行,原因是什么,怎樣修改。 沒有執(zhí)行權(quán)限 chmod +* test 步驟3:執(zhí)行程序,寫出程序的執(zhí)行結(jié)果。 步驟4:閱讀程序,掌握shell函數(shù)的編寫方法,補全函數(shù)file_run。 file_run() { ls -l | awk '/
11、^-(..*)+/ {print $9}' } 步驟5:修改程序中的函數(shù)uers(),使得顯示在線用戶時不分行?!蔡崾荆嚎梢允褂醚h(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é)論 Linu*系統(tǒng)shell編程其本質(zhì)就是linu*命令的組合,通過許多簡單命令的組合可以完成很多功能,可以開發(fā)一些小型程序。 實驗三
12、Linu*下簡單C程序設(shè)計與文件操作 1、實驗?zāi)康? (3) 學(xué)習(xí)和掌握gcc等Linu*的開發(fā)調(diào)試環(huán)境。 (4) 學(xué)習(xí)并掌握Linu*的文件操作。 (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:
13、仔細觀察這兩個程序,比擬標準C的文件操作和Linu*的系統(tǒng)調(diào)用open、read、write等的使用區(qū)別。 答:標準c的文件操作一個是庫函數(shù)的調(diào)用,linu*中系統(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í)并分別使用標
14、準C的文件操作函數(shù)和Linu*的系統(tǒng)調(diào)用創(chuàng)立一個對學(xué)生根本信息進展操作〔插入、修改和刪除〕的C程序,學(xué)生根本信息以構(gòu)造體的形式存儲在文件stu.info中,struct stu_info的定義如下: struct stu_info { char stu_num[12]; char name[10]; short int se*;/*0為女生,1為男生*/ char mobile_phone[12]; }; 3、實驗結(jié)論 通過對文件操作的編程,讓我掌握了文件的創(chuàng)立,翻開,讀寫,以及特定位置的讀寫關(guān)閉等操作。并且從系統(tǒng)底層調(diào)用和標準c函數(shù)庫兩個角度對文件的操作比擬中,認識到
15、兩者的異同。 實驗四 Linu*下進程操作與進程間通信 1、實驗?zāi)康? (1) 學(xué)習(xí)和掌握fork等系統(tǒng)調(diào)用的根本使用方法。 (2) 利用Linu*中的管道實現(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
16、 步驟3:寫出編譯這三個程序的makefile,然后利用make進展編譯,談?wù)勥@么做的好處。 可以節(jié)省勞動時間,讓三個程序同時編譯,簡化了操作。 步驟4:運行這三個程序,寫出運行結(jié)果。 步驟5:屏幕上顯示出的執(zhí)行結(jié)果是哪一個進程執(zhí)行的結(jié)果? father和child 步驟6:父進程中的printf有向屏幕輸出嗎?為什么? 沒有,因為父進程的標準輸出已經(jīng)被重定向。 步驟7:利用父子進程間的管道通信方式,改寫實驗3步驟6要求的程序。 3、實驗結(jié)論 通過該節(jié)實驗,我更進一步理解了fock函數(shù)dup函數(shù)e*ercl函數(shù)的工作原理,讓我了解到了進程并發(fā)的概念。學(xué)習(xí)了如何創(chuàng)立子進程,進
17、程映象替換,以及通過無名管道實現(xiàn)父子進程中的輸入輸出重定向 實驗五 Linu*線程的使用 1、實驗?zāi)康? 學(xué)習(xí)和掌握Linu*線程的創(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ù)中
18、各個參數(shù)的意義,并給出線程的入口函數(shù)的調(diào)用方法,描述兩線程間參數(shù)傳遞的方式。 該函數(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)
19、代碼,答復(fù)這跟進程有什么不同。 由于線程是共享進程內(nèi)資源的,所以子線程如果改變了aa的值,主線程內(nèi)aa的值也會發(fā)生改變,而如果是創(chuàng)立了一個子進程,假設(shè)子進程改變了aa的值,主進程內(nèi)aa的值是沒有發(fā)生改變的。 步驟4:輸入程序5-2,編譯并運行,寫出運行結(jié)果。 Input some te*t,Enter 'end' to finish basjk You input 5 characters end Waiting for thread to finish... Thread joined 步驟5:仔細研讀代碼,描述利用信號量實現(xiàn)線程間同步調(diào)用方法。 定義一個全局的sem_t
20、類型的變量,通過函數(shù)sem_init(&bin_sem,0,0)初始化信號量,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 thethread
21、s of a process. If pshared is 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ù),以及如何利用信號量同步線程。 實驗六 Linu*進程間的IPC 1
22、、實驗?zāi)康? 學(xué)習(xí)和掌握Linu*進程間的IPC及同步方法。 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與*的出現(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 si
23、ze, int shmflg); //向系統(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要求的程序。要求啟動
24、多個進程,每一個進程都可以單獨對文件進展操作,進程間通過信號量進展同步,對文件的操作映射到共享內(nèi)存中。 3、 實驗結(jié)論 通過對改節(jié)實驗,讓我了解了進程IPC信號量訪問臨界區(qū),以及進程之間訪問共享內(nèi)存的實現(xiàn)方法和同步機制,掌握了上述一系列函數(shù)的使用方法。IPC用于完成進程間通信,包括信號量,共享內(nèi)存已及消息隊列,在編寫linu*程序時非有用 實驗七 Linu*下訪問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
25、中創(chuàng)立表children。 create table children ( childno int(11)not null auto_increment, fname varchar(30), age int(11), primarykey(childno) ); 步驟3:向表children中插入假設(shè)干記錄。 insert into children values (1,’Jenny’,17); Insert into children values (2,’Andrew’,13); Insert into children values (3,’Ale*’,12);
26、Insert 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構(gòu)造。 3、實驗結(jié)論 通過mysql.h C語言可以使用數(shù)據(jù)庫。通過該節(jié)實驗我掌握了linu*下怎么用c語言進展簡單的數(shù)據(jù)庫方面的編程。 實驗八 L
27、inu*下網(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ù)操作請求的輸入,然后上傳到效勞器端完成對數(shù)據(jù)庫的實際操作。同學(xué)在實現(xiàn)時應(yīng)盡可能的使用前幾個實驗的成果,即應(yīng)該包括多線程或多進程、數(shù)據(jù)庫以及socket等。 3、實驗結(jié)論 通過改節(jié)實驗我掌握了linu*下用c語言進展網(wǎng)絡(luò)編程。socket可以實現(xiàn)不同主機間進程的通信,可以編寫出網(wǎng)絡(luò)應(yīng)用程序 課堂練習(xí): 1.
28、 grep:
#include
29、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+=sizeof(char); } fscanf(
30、fp,"%c",&c);
line++;
if(!feof(fp))
goto NEW_LINE;
return 1;
}
運行結(jié)果:
2. bash:
#include
31、hile(1) { j=0; fgets(arg,sizeof(arg),stdin); //fgets比gets多接收一個LF(換行)即\n //gets(arg); if(!strcmp(arg,"e*it\n")) return; pid = fork(); if(pid==0) { lenth=strlen(arg); lenth--; arg[lenth]=0; //printf("%s\n",arg); //printf("%d\n",arg[2]); //printf("%
32、d\n",lenth);
if(lenth==0)
return;
parg=(char**)malloc(sizeof(char**));
*(parg+j)=arg;
j++;
for(i=0;i 33、
//printf("%s %s %s",parg[0],parg[1],parg[2]);
e*ecvp(*parg,parg);
}
else
{
wait(0);
printf("mysh#");
}
}
}
運行結(jié)果:
3.生產(chǎn)者消費者:
//semaphore&sharememory.c
#include 34、 35、l,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_stuff;
int shmid;
sem_id = semget((key_t)1234, 2, 06 36、66 | 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 failed\n");
e*it(E*IT_FAILURE);
}
shared_me 37、mory = shmat(shmid, (void *)0, 0);
if (shared_memory == (void *)-1) {
fprintf(stderr, "shmat failed\n");
e*it(E*IT_FAILURE);
}
printf("Memory attached at %*\n", (int)shared_memory);
shared_stuff = (struct shared_use_st *)shared_memory;
while(running) {
38、 semaphore_p(1);
printf("You wrote: %s", shared_stuff->some_te*t);
sleep( rand() % 4 );
if (strncmp(shared_stuff->some_te*t, "end", 3) == 0) {
running = 0;
}
semaphore_v(0);
}
if (shmdt(shared_memory) == - 39、1) {
fprintf(stderr, "shmdt failed\n");
e*it(E*IT_FAILURE);
}
if (shmctl(shmid, IPC_RMID, 0) == -1) {
fprintf(stderr, "shmctl(IPC_RMID) failed\n");
e*it(E*IT_FAILURE);
}
e*it(E*IT_SUCCESS);
}
static int set_semvalue(int val,int th)
{
un 40、ion 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)
fprintf(stderr, "Failed to delete semap 41、hore\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");
return(0);
}
return(1);
}
static 42、 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);
}
//semaphore&sharememory1.c 43、
#include 44、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 int semaphore_v(int th);
static int sem_id;
int main()
{
int running = 1;
void *share 45、d_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(struct shared_use_st), 0666 | IPC_CREAT);
if (shmid == -1) {
fprintf(stderr, "shmget fai 46、led\n");
e*it(E*IT_FAILURE);
}
shared_memory = shmat(shmid, (void *)0, 0);
if (shared_memory == (void *)-1) {
fprintf(stderr, "shmat failed\n");
e*it(E*IT_FAILURE);
}
printf("Memory attached at %*\n", (int)shared_memory);
shared_stuff = (struc 47、t shared_use_st *)shared_memory;
while(running) {
printf("Enter some te*t: ");
fgets(buffer, BUFSIZ, stdin);
semaphore_p(0);
strncpy(shared_stuff->some_te*t, buffer, TE*T_SZ);
semaphore_v(1);
if (strncmp(buffer, "end", 3) == 0) {
r 48、unning = 0;
}
}
if (shmdt(shared_memory) == -1) {
fprintf(stderr, "shmdt failed\n");
e*it(E*IT_FAILURE);
}
e*it(E*IT_SUCCESS);
}
static int set_semvalue(int val,int th)
{
union semun sem_union;
sem_union.val = val;
if (semctl(sem_id, t 49、h, 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)
fprintf(stderr, "Failed to delete semaphore\n");
}
static int semaphore_p(int th)
{
struct sembuf sem_b 50、;
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");
return(0);
}
return(1);
}
static int semaphore_v(int th)
{
struct sembuf sem_b;
sem_b.sem_num 51、 = 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é)果:
. z.
- 溫馨提示:
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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 房地產(chǎn)銷售工作總結(jié)區(qū)域績效完成情況明年工作計劃
- 人資部部門年終總結(jié)人力資源規(guī)劃與實施
- 教師課程總結(jié)匯報提升教學(xué)質(zhì)量與反思教學(xué)過程
- 2025年中小學(xué)校黨建工作計劃2篇例文
- 2025年學(xué)校黨建工作計劃(工作要點)5篇范文
- 2025年學(xué)校黨建工作計劃例文【3份】
- 初中英語知識點總結(jié):英語副詞精華講解
- 施工安全事故易發(fā)期
- 安全管理人員安全工作總結(jié)范文
- 初中英語重點語法:三大從句總結(jié)
- 鐵路廣場冰雪等極端天氣的安全應(yīng)急預(yù)案
- 安全培訓(xùn)資料:某公司職業(yè)病防治宣傳教育培訓(xùn)制度
- 初中英語最齊全的8大時態(tài)
- 硝酸使用安全和典型案例、對策
- 安全培訓(xùn)資料:某公司職業(yè)病危害事故處置與報告制度