嵌入式系統(tǒng)開發(fā)期末報告_第1頁
嵌入式系統(tǒng)開發(fā)期末報告_第2頁
嵌入式系統(tǒng)開發(fā)期末報告_第3頁
嵌入式系統(tǒng)開發(fā)期末報告_第4頁
嵌入式系統(tǒng)開發(fā)期末報告_第5頁
已閱讀5頁,還剩55頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

2016年秋季學期A卷、考查、開卷

課程名稱嵌入式系統(tǒng)開發(fā)

命題教師:姜愉適用班級:物聯(lián)本151、152、153班

答卷說明:1.本試卷共1頁,1個大題,滿分100分,時間120分鐘。

學號:1504412241姓名:藍意樂班別:物聯(lián)本152

題號一總分評分人

得分

一、作品題:(本大題共1大題,共100分)

實踐總結(jié)要求包括:

1、3000字以上;(10分)

2,詳細論述Linux系統(tǒng)下各目錄的主要功能;(10分)

3、論述shell的基本工作原理;(10分)

4、結(jié)合程序?qū)嵗敿氄撌龀S玫?種進程通信方式;(20分)

5,對進程與線程的區(qū)別進行分析;(10分)

6、結(jié)合實例對gcc、gdb、make的實現(xiàn)方法做詳盡論述;(20分)

7,結(jié)合套接字理論對TCP、UDP通信原理進行論述;(10分)

8、學習心得體會。(10分)

第1頁共1頁

一、詳細論述Linux系統(tǒng)下各目錄的主要功能。

目錄

1、樹狀目錄結(jié)構(gòu)圖

2、/目錄

3、/etc/目錄

4、/usi7目錄

5、/var/目錄

6、/proc/目錄

7、/dev/目錄

卜面紅色字體為比較竄要的目錄

1、樹狀目錄結(jié)構(gòu)圖

第2頁共2頁

t/Jggji

_[bn」的T4箕用的I阱

-―—)8動文件.所有與系茨8

83』就有關(guān)的文件知某存在過里

-------(一dev,設(shè)備文件

(一——系毓不和大部分應(yīng)用

----------"J程序的g局配■文件

----------1hone,使用者個人冢目錄

----------(ib/[系挽聯(lián)摩文怦

-------(E/常雕蛇點

----------(0"/第三方&序安然

----------(proc/顯:T東現(xiàn)狀55文件

----------(,81」昔般家目呆

----------(sbtn1餐利一專用桿,

----------[imp/*「文件

2、/目錄

目錄描述

/第一層次結(jié)構(gòu)的根、整個文件系統(tǒng)層次結(jié)構(gòu)的根目錄。

需要在單用戶模式可用的必要命令(可執(zhí)行文件);面向所有用戶,例如:ca

/bin/

t、Is、cp,和/usr/bin類似。

第3頁共3頁

/boot/引導程序文件,例如:kernekinitrd;時常是一個單獨的分區(qū)⑹

/dev/必要設(shè)備,例如:,/dev/null.

特定主機,系統(tǒng)范圍內(nèi)的配置文件。

關(guān)于這個名稱目前有爭議。在貝爾實驗室關(guān)于UNIX實現(xiàn)文檔的早期版本中,/

etc被稱為/etcetra目錄,[7]這是由于過去此目錄中存放所有不屬于別處的所

/etc/

有東西(然而,F(xiàn)HS限制/etc存放靜態(tài)配置文件,不能包含二進制文件)。[8]

自從早期文檔出版以來,目錄名稱已被以各種方式重新稱呼。最近的解釋包括

反向縮略語如:"可編輯的文本配置"(英文"EditableTextConfiguration")或

11擴展工具箱"(英文"ExtendedToolChest")?[9]

/etc/opt//opt/的配置文件

/etc/Xll/X_Window系統(tǒng)(版本11)的配置文件

/etc/sgml/SGML的配置文件

/etc/xml/XML的配置文件

/home/用戶的家目錄,包含保存的文件、個人設(shè)置等,一般為單獨的分區(qū)。

/lib//bin/and/sbin/中二進制文件必要的庫文件。

/media/可移除媒體(如CD-ROM)的掛載點(在FHS-2.3中事現(xiàn))。

在ext3文件系統(tǒng)中,當系統(tǒng)意外崩潰或機器意外關(guān)機,會產(chǎn)生一些文件碎片

在這里。當系統(tǒng)在開機啟動的過程中fsck工具會檢查這里,并修復(fù)已經(jīng)損壞的

/lost+found

文件系統(tǒng)。當系統(tǒng)發(fā)生問題??赡軙形募灰苿拥竭@個目錄中,可能需要用

手工的方式來修復(fù),或移到文件到原來的位置上。

臨時掛載的文件系統(tǒng)。比如cdrom,u盤等,直接插入光驅(qū)無法使用,要先掛載

/mnt/

后使用

/opt/可選應(yīng)用軟件包。

虛擬文件系統(tǒng),將內(nèi)核叮進程狀態(tài)歸檔為文本文件(系統(tǒng)信息都存放這目錄

/proc/下)。例如:uptime>networko在Linux中,對應(yīng)Proofs格式掛載。該目錄

下文件只能看不能改(包括root)

/root/超級用戶的家目錄

必要的系統(tǒng)二進制文件,例如:init、ip、mountosbin目錄下的命令,普通

/sbin/

用戶都執(zhí)行不了。

/srv/站點的具體數(shù)據(jù),由系統(tǒng)提供。

/tmp/臨時文件(參見/var/tmp),在系統(tǒng)重啟時目錄中文件不會被保留。

/usr/默認軟件都會存于該目錄下。用于存儲只讀用戶數(shù)據(jù)的第二層次;包含絕大多

第4頁共4頁

數(shù)的(多)用戶工具和應(yīng)用程序。

變量文件一一在正常運行的系統(tǒng)中其內(nèi)容不斷變化的文件,如日志,脫機文件

/var/和臨時電子郵件文件。有時是一個單獨的分區(qū)。如果不單獨分區(qū),有可能會把

整個分區(qū)充滿。如果單獨分區(qū),給大給小都不合適。

3、/etc/目錄

特定主機系統(tǒng)范圍內(nèi)的配置文件。

目錄描述

/etc/rc/etc/rc.d

啟動、或改變運行級時運行的scripts或scripts的目錄.

/etc/rc*.d

/etc/hosts本地域名解析文件

/etc/sysconfig/networkIP、掩碼、網(wǎng)關(guān)、主機名配置

/etc/resolv.confDNS服務(wù)器配置

/etc/fstab開機自動掛載系統(tǒng),所有分區(qū)開機都會自動掛載

設(shè)定系統(tǒng)啟動時Init進程將把系統(tǒng)設(shè)置成什么樣的runlevel

/etc/inittab

及加載相關(guān)的啟動文件配置

/etc/exports設(shè)置NFS系統(tǒng)用的配置文件路徑

/etc/init.d這個目錄來存放系統(tǒng)啟動腳本

/etc/profile,

全局系統(tǒng)環(huán)境配置變量

/etc/csh.login,/etc/csh.cshrc

/etc/issue認證前的輸出信息,默認輸出版本內(nèi)核信息

/etc/motd設(shè)置認證后的輸出信息,

當前安裝的文件系統(tǒng)列表.由scripts初始化,并由mount命

/etc/mtab令自動更新.需要一個當前安裝的文件系統(tǒng)的列表時使用,

例如df命令

/etc/group類似/etc/passwd,但說明的不是用戶而是組.

用戶數(shù)據(jù)庫,其中的域給出了用戶名、真實姓名、家目錄、

/etc/passwd

加密的口令和用戶的其他信息.

在安裝了影子口令軟件的系統(tǒng)上的影子口令文件.影子口令

/etc/shadow文件將/etc/passwd文件中的加密口令移動到/etc/shadow

中,而后者只對root可讀.這使破譯口令更困難.

/etc/sudoers可以sudo命令的配置文件

/etc/syslog.conf系統(tǒng)日志參數(shù)配置

第5頁共5頁

/etc/login.defs設(shè)置用戶帳號限制的文件

確認安全終端,即哪個終端允許root登錄.一般只列出虛擬

/etc/securetty控制臺,這樣就不可能(至少很困難)通過modem或網(wǎng)絡(luò)闖

入系統(tǒng)并得到超級用戶特權(quán).

/etc/printcap類似/etc/termcap,但針對打印機.語法不同.

列出可信任的shell.chsh命令允許用戶在本文件指定范圍

內(nèi)改變登錄shell.提供一臺機器FTP服務(wù)的服務(wù)進程ftpd檢

/etc/shells

查用戶shell是否列在/etc/shells文件中,如果不是將不允

許該用戶登錄.

如果服務(wù)器是通過xinetd模式運行的,它的腳本要放在這

/etc/xinetd.d個目錄下。有些系統(tǒng)沒有這個目錄,比如Slackware,有些

老的版本也沒有。在RedhatFedora中比較新的版本中存在。

/etc/opt//opt/的配置文件

/etc/Xll/X_Window系統(tǒng)(版本11)的配置文件

/etc/sgml/SGML的配置文件

/etc/xml/XML的配置文件

/etc/skel/默認創(chuàng)建用戶時,把該目錄拷貝到家目錄下

4、/usr/目錄

默認軟件都會存于該目錄卜;用于存儲只讀用戶數(shù)據(jù)的第二層次;包含絕大多數(shù)的用戶工具和應(yīng)用程序.

目錄描述

/usr/XHR6存放X-Windows的目錄;

/usr/games存放著XteamLinux自帶的小游戲;

/usr/docLinux技術(shù)文檔;

/usr/include用來存放Linux下開發(fā)和編譯應(yīng)用程序所需要的頭文件;

/usr/lib存放一些常用的動態(tài)鏈接共享庫和靜態(tài)檔案庫;

/usr/man幫助文檔所在的目錄;

/usr/srcLinux開放的源代碼,就存在這個目錄,愛好者們別放過哦;

/usr/bin/非必要可執(zhí)行文件(在單用戶模式中不需要);面向所有用戶。

/usr/lib//usr/bin/和/usr/sbin/中二進制文件的庫。

/usr/sbin/非必要的系統(tǒng)二進制文件,例如:大量網(wǎng)絡(luò)服務(wù)的守護進程。

第6頁共6頁

/usr/share/體系結(jié)構(gòu)無關(guān)(共享)數(shù)據(jù)。

/usr/src/源代碼,例如吶核源代碼及其頭文件。

/usr/XHR6/XWindow系統(tǒng)版本11,Release6.

本地數(shù)據(jù)的第三層次,具體到本臺主機。通常而言有進一步的子目錄,例如:

/usr/local/bin/、lib/、share/.這是提供給一般用戶的/usr目錄,在這里安裝一般的應(yīng)用

軟件;

5、/var/目錄

/var包括系統(tǒng)般運行時要改變的數(shù)據(jù).每個系統(tǒng)是特定的,即不通過網(wǎng)絡(luò)與其他計算機共享.

目錄描述

/var/log/message日志信息,按周自動輪詢

/var/spool/cron/root定時器配置文件目錄,默認按用戶命名

記錄登陸系統(tǒng)存取信息的文件,不管認證成功還是認證失敗都

/var/log/secure

會記錄

/var/log/wtmp記錄登陸者信息的文件,last,who,w命令信息來源于此

當郵件服務(wù)未開啟時,所有應(yīng)發(fā)給系統(tǒng)管理員的郵件都將堆放

/var/spool/clientmqueue/

在此

/var/spool/mail/郵件目錄

比/tmp允許的大或需要存在較長時間的臨時文件.(雖然系統(tǒng)

/var/tmp

管理員可能不允許/var/tmp有很舊的文件.)

/var/lib系統(tǒng)正常運行時要改變的文件.

/usr/local中安裝的程序的可變數(shù)據(jù)(即系統(tǒng)管理員安裝的程

/var/local序).注意,如果必要,即使本地安裝的程序也會使用其他/var目

錄,例如/var/lock.

鎖定文件.許多程序遵循在/var/lock中產(chǎn)生一個鎖定文件的約

/var/lock定,以支持他們正在使用某個特定的設(shè)備或文件.其他程序注意

到這個鎖定文件,將不試圖使用這個設(shè)備或文件.

/var/log/各種程序的Log文件,特別是login(/var/log/wtmplog所有到

第7頁共7頁

系統(tǒng)的登錄和注銷)和syslog(/var/log/messages里存儲所有核

心和系統(tǒng)程序信息./var/bg里的文件經(jīng)常不確定地增長,應(yīng)該

定期清除.

保存到下次引導前有效的關(guān)于系統(tǒng)的信息文件.例如,

/var/run

/var/run/utmp包含當前登錄的用戶的信息.

應(yīng)用程序緩存數(shù)據(jù)。這些數(shù)據(jù)是在本地生成的一個耗時的I/O

/var/cache/或計算結(jié)果。應(yīng)用程序必須能夠再生或恢復(fù)數(shù)據(jù)。緩存的文件

可以被刪除而不導致數(shù)據(jù)丟失。

6、/proc/目錄

虛擬文件系統(tǒng),將內(nèi)核與進程狀態(tài)歸檔為文本文件(系統(tǒng)信息都存:放這目錄下)。

例如:uptime、networko在Linux「3對應(yīng)Procfs格式掛載。該目錄下文件只能看不能改(包括root)

目錄描述

/proc/meminfo查看內(nèi)存信息

還記得top以及uptime吧?沒錯!上頭的三個平均數(shù)值就是記錄在

/proc/loadavg

此!

/proc/uptime就是用uptime的時候,會出現(xiàn)的資訊啦!

/proc/cpuinfo關(guān)于處理器的信息,如類型、廠家、型號和性能等。

加載kernel時所下達的相關(guān)參數(shù)!查閱此文件,可了解系統(tǒng)是如何

/proc/cmdline

啟動的!

/proc/filesystems目前系統(tǒng)已經(jīng)加載的文件系統(tǒng)羅!

/proc/interrupts目前系統(tǒng)上面的IRQ分配狀態(tài)。

/proc/ioports目前系統(tǒng)上面各個裝置所配置的I/O位址。

/proc/kcore這個就是內(nèi)存的大小啦!好大對吧!但是不要讀他啦!

/proc/modules目前我們的Linux已經(jīng)加載的模塊列表,也可以想成是驅(qū)動程序啦!

/proc/mounts系統(tǒng)已經(jīng)掛載的數(shù)據(jù),就是用mount這個命令呼叫出來的數(shù)據(jù)啦!

到底系統(tǒng)掛加載的內(nèi)存在哪里?呵呵!使用掉的partition就記錄在此

/proc/swaps

啦!

使用fdisk-1會出現(xiàn)目前所有的partition吧?在這個文件當中也有

/proc/partitions

紀錄喔!

第8頁共8頁

/proc/pci在PCI匯流排上面,每個裝置的詳細情況!可用Ispci來查閱!

/proc/version核心的版本,就是用uname-a顯示的內(nèi)容啦!

/proc/bus/*一些匯流排的裝置,還有U盤的裝置也記錄在此喔!

7、/dev/目錄

設(shè)備文件分為兩種:塊設(shè)備文件(b)和字符設(shè)備文件⑹

設(shè)備文件般存放在/dev目錄下,

對常見設(shè)備文件作如下說明:

目錄描述

/dev/hd[a-t]IDE設(shè)備

/dev/sd[a-z]SCSI設(shè)備

/dev/fd[0-7]標準軟驅(qū)

/dev/md[0-31]軟raid設(shè)備

/dev/loop[0-7]本地回環(huán)設(shè)備

/dev/ram[0-15]內(nèi)存

/dev/null無限數(shù)據(jù)接收設(shè)備,相當于黑洞

/dev/zero無限零資源

/dev/tty[0-63]虛擬終端

/dev/ttyS[0-3]串口

/dev/lp[0-3]并口

/dev/console控制臺

/dev/fb[0-31]framebuffer

第9頁共9頁

/dev/cdrom=>/dev/hdc

/dev/modem=>/dev/ttyS[0-9]

/dev/pilot=>/dev/ttyS[0-9]

/dev/random隨機數(shù)設(shè)備

/dev/urandom隨機數(shù)設(shè)備

二、論述shell的基本工作原理。

LinuxShell工作原理

Linux系統(tǒng)提供給用戶的最重要的系統(tǒng)程序是Shell命令語言解釋程序。它不

屬于內(nèi)核部分,而是在核心之外,以用戶態(tài)方式運行。

其基本功能是解釋并執(zhí)行用戶打入的各種命令,實現(xiàn)用戶與Linux核心的接口。

系統(tǒng)初啟后,核心為每個終端用戶建立一個進程去

執(zhí)行Shell解釋程序。它的執(zhí)行過程基本上按如下步驟:

(1)讀取用戶由鍵盤輸入的命令行。

(2)分析命令,以命令名作為文件名,并將其它參數(shù)改造為系統(tǒng)調(diào)用execve()

內(nèi)部處理所要求的形式。

(3)終端進程調(diào)用fork()建立一個子進程。

(4)終端進程本身用系統(tǒng)調(diào)用wait4()來等待子進程完成(如果是后臺命令,

則不等待)。當子進程運行時調(diào)用execve(),

子進程根據(jù)文件名(即命令名)到目錄中查找有關(guān)文件(這是命令解釋程序構(gòu)

成的文件),將它調(diào)入內(nèi)存,執(zhí)行這個程序(解釋這條命令)。

(5)如果命令末尾有&號(后臺命令符號),則終端進程不用系統(tǒng)調(diào)用wait4()

等待,立即發(fā)提示符,讓用戶輸入下一個命令,轉(zhuǎn)⑴。

如果命令末尾沒有&號,則終端進程要?直等待,當子進程(即運行命令的進程)

完成處理后終止,向父進程(終端進程)報告,

此時終端進程醒來,在做必要的判別等工作后,終端進程發(fā)提示符,讓用戶輸

入新的命令,重復(fù)上述處理過程。

第10頁共10

Linux系統(tǒng)的shell作為操作系統(tǒng)的外殼,為用戶提供使用操作系統(tǒng)的接

口。它是命令語言、命令解釋程序及程序設(shè)計語言的統(tǒng)稱。

shell是用戶和Linux內(nèi)核之間的接口程序,如果把Linux內(nèi)核想象成一

個球體的中心,shell就是圍繞內(nèi)核的外層。

當從shell或其他程序向Linux傳遞命令時,內(nèi)核會做出相應(yīng)的反應(yīng)。

shell是一個命令語言解釋器,它擁有自己內(nèi)建的shell命令集,shell

也能被系統(tǒng)中其他應(yīng)用程序所調(diào)用。用戶在提示符下輸入的命令都由shell先

解釋然后傳給Linux核心。

有一些命令,比如改變工作目錄命令cd,是包含在shell內(nèi)部的。還有一

些命令,例如拷貝命令cp和移動命令rm,是存在于文件系統(tǒng)中某個目錄下的

單獨的程序。對用戶而言,不必關(guān)心一個命令是建立在shell內(nèi)部還是一個單

獨的程序。

shell首先檢查命令是否是內(nèi)部命令,若不是再檢查是否是一個應(yīng)用程序

(這里的應(yīng)用程序可以是Linux本身的實用程序,如1s和rm,也可以是購買

的商業(yè)程序,如xv,或者是自由軟件,如emacs)。然后shell在搜索路徑里

尋找這些應(yīng)用程序(搜索路徑就是一個能找到可執(zhí)行程序的目錄列表)。如果

鍵入的命令不是一個內(nèi)部命令并且在路徑里沒有找到這個可執(zhí)行文件,將會顯

示一條錯誤信息。如果能夠成功找到命令,該內(nèi)部命令或應(yīng)用程序?qū)⒈环纸鉃?/p>

系統(tǒng)調(diào)用并傳給Linux內(nèi)核。

shell的另一個重要特性是它自身就是一個解釋型的程序設(shè)計語言,shell

程序設(shè)計語言支持絕大多數(shù)在高級語言中能見到的程序元素,如函數(shù)、變量、

數(shù)組和程序控制結(jié)構(gòu)。shell編程語言簡單易學,任何在提示符中能鍵入的命

令都能放到一個可執(zhí)行的shell程序中。

當普通用戶成功登錄,系統(tǒng)將執(zhí)行一個稱為shell的程序。正是shell進

程提供了命令行提示符。作為默認值(TurboLinux系統(tǒng)默認的shell是BASH),

對普通用戶用“$”作提示符,對超級用戶(root)用作提示符。

一旦出現(xiàn)了shell提示符,就可以鍵入命令名稱及命令所需要的參數(shù)。

shell將執(zhí)行這些命令。如果一條命令花費了很長的時間來運行,或者在屏幕

上產(chǎn)生了大量的輸出,可以從鍵盤上按ctrl+c發(fā)出中斷信號來中斷它(在正常

結(jié)束之前,中止它的執(zhí)行)。

第11頁共11頁

當用戶準備結(jié)束登錄對話進程時,可以鍵入logout命令、exit命令或文

件結(jié)束符(EOF)(按ctrl+d實現(xiàn)),結(jié)束登錄。

三、結(jié)合程序?qū)嵗敿氄撌龀S玫?種進程通信方式。

linux使用的進程間通信方式:(1)管道(pipe)(2)信號(signal)(3)

消息隊列(4)共享內(nèi)存(5)信號量

]、管道通信

普通的;inuxshell都允許重定向,而重定向使用的就是管道。例如:

pslgrepvsftpd.管道是單向的、先進先出的、無結(jié)構(gòu)的、固定大小的字節(jié)

流,它把一個進程的標準輸出和另?個進程的標準輸入連接在一起。寫進

程在管道的尾端寫入數(shù)據(jù),讀進程在管道的道端讀出數(shù)據(jù)。數(shù)據(jù)讀出后將

從管道中移走,其它讀進程都不能再讀到這些數(shù)據(jù)。管道提供了簡單的流

控制機制。進程試圖讀空管道時,在有數(shù)據(jù)寫入管道前,進程將一直阻塞。

同樣,管道已經(jīng)滿時,進程再試圖寫管道,在其它進程從管道中移走數(shù)據(jù)

之前,寫進程將一直阻塞。管道主要用于不同進程間通信。

管道的創(chuàng)建

fifowrite,c

ttinclude<sys/types.h>

Sinclude<sys/stat.h>

Sinclude<errno.h>

ttinclude<fcntl.h>

Sinclude<stdio.h>

Sinclude<stdlib.h>

Sinclude<string.h>

#defineFIFO_SERVER〃/tmp/myfifo〃

main(intargc,char**argv)

(

intfd;

charwbuf[100];

intnwrite;

/*打開管道*/

fd=open(FIFO_SERVER,O_WRONLY|O_NONBLOCK,0);

if(argc==l)

(

printf(/zPleasesendsomething'n");

第12頁共12

exit(-1);

strcpy(w_buf,argv[1]);

/*向管道寫入數(shù)據(jù)*/

if((r)write=write(fd,w_buf,100))==-l)

(

if(errno==EAGAIN)

printf(Z/TheFIFOhasnotbeenreadyet.Pleasetry

later\n,z);

)

else

printf("'write%stotheFIF0\n,z,wbuf);

fifo_read.c

Sinclude<sys/types.h>

Sinclude<sys/stat.h>

ttinclude<errno.h>

Sinclude<fcntl.h>

Sinclude<stdio.h>

ttinclude<stdlib.h>

^include<string.h>

ttdefineFIFO〃/tmp/myfifo〃

main(intargc,char**argv)

(

charbuf_r[100];

intfd;

intnread;

/*創(chuàng)建管道*/

if((mkfifo(FIFO,O_CREAT|O_EXCL)<0)&&(errno!=EEXIST))

printf(z,cannotcreatefifoserver\n,z);

printf("'Preparingforreadingbytes...\n〃);

memset(buf_r,0,sizeof(buf_r));

第13頁共13

/*打開管道*/

fd=open(FIFO,O_RDONLY|O_NONBLOCK,0);

if(fd==-l)

(

perror("open");

exit(1);

)

while(1)

(

memset(buf_r,0,sizeof(buf_r));

if((nread=read(fd,buf_r,100))==-l)

(

if(errno==EAGAIN)

printf(z,nodatayet\n");

)

printf("read%sfromFIF0\n”,buf_r);

sleep(1);

)

pause。;/*暫停,等待信號*/

uniink(FIFO);//刪除文件

2、信號

信號概述

信號是軟件中斷。。它用于在一個或多個進程之間傳遞異步信號。很多條件可

以產(chǎn)生一個信號。

A、當用戶按某些終端鍵時,產(chǎn)生信號。在終端上按DELETE鍵通常產(chǎn)生中斷信

號(SIGINT)o這是停止一個已失去控制程序的方法。

B、硬件異常產(chǎn)生信號:除數(shù)為0、無效的存儲訪問等等。這些條件通常由硬件

檢測到,并將其通知內(nèi)核。然后內(nèi)核為該條件發(fā)生時正在運行的進程產(chǎn)生

適當?shù)男盘?。例如,對于?zhí)行一個無效存儲訪問的進程產(chǎn)生一個SIGSEGV。

C、進程用kill(2)函數(shù)可將信號發(fā)送給另一個進程或進程組。自然,有些限制:

接收信號進和發(fā)送信號進程的所有都必須相同,或發(fā)送信號進程的的所有

者必須是超級用戶。

D、用戶可用Kill(ID值)命令將信號發(fā)送給其它進程。此程序是Kill函數(shù)的

界面。常用此命令終止一個失控的后臺進程。

E、當檢測到某種軟件條件已經(jīng)發(fā)生,并將其通知有關(guān)進程時也產(chǎn)生信號。這里

并不是指硬件產(chǎn)生條件(如被0除),而是軟件條件。例如SIGURG(在網(wǎng)

第14頁共14

絡(luò)連接上傳來非規(guī)定波特率的數(shù)據(jù))、SIGPIPE(在管道的讀進程已終止后

一個進程寫此管道),以及SIGALRM(進程所設(shè)置的鬧鐘時間已經(jīng)超時)。

內(nèi)核為進程生產(chǎn)信號,來響應(yīng)不同的事件,這些事件就是信號源。主要信號

源如下:

(1)異常:進程運行過程中出現(xiàn)異常;

(2)其它進程:一個進程可以向另一個或一組進程發(fā)送信號;

(3)終端中斷:Ctrl-c,Ctro-\等;

(4)作業(yè)控制:前臺、后臺進程的管理;

(5)分配額:CPU超時或文件大小突破限制;

(6)通知:通知進程某事件發(fā)生,如I/O就緒等;

(7)報警:計時器到期;

Linux中的信號

1、SIGHUP2、SIGINT(終止)3、SIGQUIT(退出)4、SIGILL

5、SIGTRAP6、SIGIOT7、SIGBUS8、SIGFPE9、SIGKILL

10、SIGUSER11、SIGSEGVSIGUSER12、SIGPIPE13、SIGALRM

14、SIGTERM15、SIGCHLD16、SIGCONT17、SIGSTOP18、SIGTSTP

19、SIGTTIN20、SIGTTOU21、SIGURG22、SIGXCPU23、SIGXFSZ

24、SIGVTALRM25、SIGPROF26、SIGWINCH27、SIGIO28、SIGPWR常用

的信號:

SIGHUP:從終端上發(fā)出的結(jié)束信號;

SIGINT:來自鍵盤的中斷信號(Ctrl+c)

SIGQUIT:來自鍵盤的退出信號;

SIGFPE:浮點異常信號(例如浮點運算溢出);

SIGKILL:該信號結(jié)束接收信號的進程;

SIGALRM:進程的定時器到期口寸,發(fā)送該信號;

SIGTERM:kill命令生出的信號;

SIGCHLD:標識子進程停止或結(jié)束的信號;

SIGSTOP:來自鍵盤(Ctrl-Z)或調(diào)試程序的停止掃行信號

可以要求系統(tǒng)在某個信號出現(xiàn)時按照下列三種方式中的一種進行操作。

(1)忽略此信號。大多數(shù)信號都可使用這種方式進行處理,但有兩種信號卻決

不能被忽略。它們是:SIGKILL和SIGSTOP。這兩種信號不能被忽略的,原

因是:它們向超級用戶提供一種使進程終止或停止的可靠方法。另外,如

果忽略某些由硬件異常產(chǎn)生的信號(例如非法存儲訪問或除以0),則進

程的行為是示定義的。

(2)捕捉信號。為了做到這一點要通知內(nèi)核在某種信號發(fā)生時,調(diào)用一個用戶

函數(shù)。在用戶函數(shù)中,可執(zhí)行用戶希望對這種事件進行的處理。如果捕捉

到SIGCHLD信號,則表示子進程已經(jīng)終止,所以此信號的捕捉函數(shù)可以調(diào)

用waitpid以取得該子進程的進程ID以及它的終止狀態(tài)。

第15頁共15

(3)執(zhí)行系統(tǒng)默認動作。對大多數(shù)信號的系統(tǒng)默認動作是終止該進程。每一個

信號都有一個缺省動作,它是當進程沒有給這個信號指定處理程序時,內(nèi)

核對信號的處理。有5種缺省的動作:

(1)異常終止(abort):在進程的當前目錄下,把進程的地址空間內(nèi)容、寄存

器內(nèi)容保存到一個叫做core的文件中,而后終止進程。

(2)退出(exit):不產(chǎn)生core文件,直接終止進程。

(3)忽略(ignore):忽略該信號。

(4)停止(stop):掛起該進程。

(5)繼續(xù)(contiune):如果進程被掛起,剛恢復(fù)進程的動行。否則,忽略信

號。信號的發(fā)送與捕捉

ki11()和raise()

kill。不僅可以中止進程,也可以向進程發(fā)送其他信號。與kill函數(shù)不同的是,

raise()函數(shù)運行向進程自身發(fā)送信號#include〈sys/types.h>

#include<signal.h>

intkill(pid_tpid,intsigno);

intraise(intsigno);

兩個函數(shù)返回:若成功則為0,若出錯則為kill的pid參數(shù)有四種不同的

情況:

(1)pid>0將信號發(fā)送給進程ID為pid的進程。

(2)pid==0將信號發(fā)送給其進程組ID等于發(fā)送進程的進程組ID,而且發(fā)送進

程有許可權(quán)向其發(fā)送信號的所有進程。

(3)pid<0將信號發(fā)送給其進程組ID等于pid絕對值,而且發(fā)送進程有許可

權(quán)向其發(fā)送信號的所有進程。如上所述一樣,“所有進程”并不包括系統(tǒng)

進程集中的進程。

(4)pid==TPOSIX.1未定義種情況kill,c#include<stdio.h>

例子如下:

Sinclude<signal.h>

#include<stdio.h>

Sinclude<stdlib.h>

voidmy_func(intsign_no)

(

if(sign_no==SIGINT)

printf(,?IhavegetSIGINT'n");

elseif(sign_no==SIGQUIT)

printf(Z,IhavegetSIGQUIT'n");

)

intmainO

(

printf(/zWaitingforsignalSIGINTorSIGQUIT\n");

第16頁共16

/*注冊信號處理函數(shù)*/

signal(SIGINT,my_func);

signal(SIGQUIT,my_func);

pause();

exit(0);

)

3、消息隊列

消息隊列用于運行于同一臺機器上的進程間通信,它和管道很相似,是一個在

系統(tǒng)內(nèi)核中用來保存消息的隊列,它在系統(tǒng)內(nèi)核中是以消息鏈表的形式出

現(xiàn)。消息鏈表中節(jié)點的結(jié)構(gòu)用msg聲明。

例子如下:

ttinclude<sys/types.h>

#include<sys/msg.h>

tiinclude<unistd.h>

structmsg_buf

(

intmtype;

chardata[255];

);

intmainO

(

key_tkey;

intmsgid;

intret;

structmsg_bufmsgbuf;

key=ftok(〃/tmp/2〃,'a');

printfC'key=[%x]\n〃,key);

msgid=msgget(key,IPC_CREAT10666);/*通過文件對應(yīng)*/

if(msgid==-l)

(

printf(''createerror\nz,);

return-1;

)

第17頁共17

msgbuf.mtype=getpid();

strcpy(msgbuf.data,z,testhaha");

ret=msgsnd(msgid,&msgbuf,sizeof(msgbuf.data),IPC_NOWAIT);

if(ret==-l)

{

printf(z/sendmessageerr\n");

return-1;

)

memset(&msgbuf,0,sizeof(msgbuf));

ret=msgrcv(msgid,femsgbuf,sizeof(msgbuf.data),getpidO,IPC_NOWAIT

);

if(ret==-l)

(

printf("recvmessageerr\n");

return-1;

)

printf(z/recvmsg=[%s]\nz/,msgbuf.data);

)

4、共享內(nèi)存

共享內(nèi)存是運行在同一臺機器上的進程間通信最快的方式,因為數(shù)據(jù)不需要在

不同的進程間復(fù)制。通常由一個進程創(chuàng)建一塊共享內(nèi)存區(qū),其余進程對這

塊內(nèi)存區(qū)進行讀寫。

得到共享內(nèi)存有兩種方式:映射/dev/mem設(shè)備和內(nèi)存映像文件。前一種方式不

給系統(tǒng)帶來額外的開銷,但在現(xiàn)實中并不常用,因為它控制存取的將是實

際的物理內(nèi)存,在Linux系統(tǒng)下,這只有通過限制Linux系統(tǒng)存取的內(nèi)存

才可以做到。常用的方式是通過shmXXX函數(shù)族來實現(xiàn)利用共享內(nèi)存進行

存儲的。

首先要用的函數(shù)是shmget,它獲得一個共享存儲標識符。

#include<sys/types.h>

Sinclude<sys/ipc.h>

#include<sys/shm.h>

intshmget(key_tkey,intsize,intflag);

這個函數(shù)有點類板malloc函數(shù),系統(tǒng)按照請求分配size大小的內(nèi)存用作共享

內(nèi)存。Linux系統(tǒng)內(nèi)核中每個IPC結(jié)構(gòu)都有的一個非負整數(shù)的標識符,這

樣對一個消息隊列發(fā)送消息時只要引用標識符就可以了。這個標識符是內(nèi)

第18頁共18

核由IPC結(jié)構(gòu)的關(guān)鍵字得到的。這個關(guān)鍵字,就是上面第一個函數(shù)的key。

數(shù)據(jù)類型key_t是在頭文件sys/types.h中定義的,它是一個長整形的數(shù)

據(jù)。當共享內(nèi)存創(chuàng)建后,其余進程可以調(diào)用shmat()將其連

接到自身的地址空間中。

void*shmat(intshmid,void*addr,intflag);

shmid為shmget函數(shù)返回的共享存儲標識符,addr和flag參數(shù)決定了以什么

方式來確定連接的地址,函數(shù)的返回值即是該進程數(shù)據(jù)段所連接的實際地

址,進程可以對此進程進行讀寫操作。

例子如下:

ttinclude<stdlib.h>

ttinclude<stdio.h>

Sinclude<string.h>

ttinclude<errno.h>

Sinclude<unistd.h>

Sinclude<sys/stat.h>

Sinclude<sys/types.h>

Sinclude<sys/ipc.h>

Sinclude<sys/shm.h>

#definePERMS_IRUSR|S_IWUSR

/*共享內(nèi)存*/

intmain(intargc,char**argv)

(

intshmid;

char*p_addr,*c_addr;

if(argc!=2)

(

fprintf(stderr,z,Usage:%s\n\az,,argv[0]);

exit(1);

)

/*創(chuàng)建共享內(nèi)存*/

if((shmid=shmget(IPC_PRIVATE,1024,PERM))=1)

(

fprintf(stderr,^CreateShareMemory

Error:%s\n\az,,strerror(errno));

exit(1);

第19頁共19

/*創(chuàng)建子進程*/

if(fork())//父進程寫

(

p_addr=shmat(shmid,0,0);

memset(p_addr,'\0",1024);

strncpy(p_addr,argv[l],1024);

wait(NULLr//釋放資源,不關(guān)心終止狀態(tài)

exit(0);

)

else//子進程讀

(

sleep(l);//暫停1秒

c_addr=shmat(shmid,0,0);

printf(z,Clientget%s\n',c_addr);

exit(0);

)

)

5、信號量

信售量又稱為信號燈,它是用來協(xié)調(diào)不同進程間的數(shù)據(jù)對象的,而最主要的

應(yīng)用是前一節(jié)的共享內(nèi)存方式的進程間通信。本質(zhì)上,信號量是一個計數(shù)

器,它用來記錄對某個資源(如共享內(nèi)存)的存取狀況。一般說來,為了

獲得共享資源,進程需要執(zhí)行下列操作:

(1)測試控制該資源的信號量。

(2)若此信號量的值為正,則允許進行使用該資源。進程將信號量減1。(3)

若此信號量為0,則該資源目前不可用,進程進入睡眠狀態(tài),直至信號量

值大于0,進程被喚醒,轉(zhuǎn)入步驟(1)。

(4)當進程不再使用一個信號量控制的資源時,信號量值加1。如果此時有

進程正在睡眠等待此信號量,則喚醒此進程。

例子如下:

intopen_semaphore_set(key_tkeyval,intnumsems)

(

intsid;

if(Inumsems)

return(-1);

if((sid=semget(mykey,numsems,IPC_CREAT0660))==T)

{

return(-1);

第20頁共20

return(sid);

};、

semopO

系統(tǒng)調(diào)用:semopO;調(diào)用原型:intsemop(intsemid,struct

sembuf*sops,unsignednsops);

返回值:0,如果成功。-1,

如果失敗:errno=E2BIG(nsops大于最大的ops數(shù)目

四、對進程與線程的區(qū)別進行分析。

對于操作系統(tǒng)而言,進程是核心之核心,整個現(xiàn)代操作系統(tǒng)的

根本,就是以進程為單位在執(zhí)行任務(wù)。系統(tǒng)的管理架構(gòu)也是基于進

程層面的。在按下電源鍵之后,計算機就開始了復(fù)雜的啟動過程,

此處有一個經(jīng)典問題:當按下電源鍵之后,計算機如何把自己由靜

止啟動起來的?本文不討論系統(tǒng)啟動過程,請讀者自行科普。操作

系統(tǒng)啟動的過程簡直可以描述為上帝創(chuàng)造萬物的過程,期初沒有世

界,但是有上帝,是上帝創(chuàng)造了世界,之后創(chuàng)造了萬物,然后再創(chuàng)

造了人,然后塑造了人的七情六欲,再然后人類社會開始遵循自然

規(guī)律繁衍生息。。。操作系統(tǒng)啟動進程的階段就相當于上帝造人的

階段。本文討論的全部內(nèi)容都是“上帝造人”之后的事情。第一個

被創(chuàng)造出來的進程是0號進程,這個進程在操作系統(tǒng)層面是不可見

的,但它存在著。0號進程完成了操作系統(tǒng)的功能加載與初期設(shè)定,

第21頁共21

然后它創(chuàng)造了1號進程(init),這個1號進程就是操作系統(tǒng)的“耶

穌”。1號進程是上帝派來管理整個操作系統(tǒng)的,所以在用pstre

e查看進程樹可知,1號進程位于樹根。再之后,系統(tǒng)的很多管理

程序都以進程身份被1號進程創(chuàng)造出來,還創(chuàng)造了與人類溝通的橋

梁一一shello從那之后,人類可以跟操作系統(tǒng)進行交流,可以編

寫程序,可以執(zhí)行任務(wù)。。。

而這一切,都是基于進程的。每一個任務(wù)(進程)被創(chuàng)建時一,系

統(tǒng)會為他分配存儲空間等必要資源,然后在內(nèi)核管理區(qū)為該進程創(chuàng)

建管理節(jié)點,以便后來控制和調(diào)度該任務(wù)的執(zhí)行。

進程真正進入執(zhí)行階段,還需要獲得CPU的使用權(quán),這一切都是操

作系統(tǒng)掌管著,也就是所謂的調(diào)度,在各種條件滿足(資源與CPU

使用權(quán)均獲得)的情況下,啟動進程的執(zhí)行過程。

除CPU而外,一個很重要的資源就是存儲器了,系統(tǒng)會為每個進程

分配獨有的存儲空間,當然包括它特別需要的別的資源,比如寫入

時外部設(shè)備是可使用狀態(tài)等等。有了上面的引入,我們可以對進程

做一個簡要的總結(jié):

進程,是計算機中的程序關(guān)于某數(shù)據(jù)集合上的一次運行活動,是系

統(tǒng)進行資源分配和調(diào)度的基本單位,是操作系統(tǒng)結(jié)構(gòu)的基礎(chǔ)。它的

執(zhí)行需要系統(tǒng)分配資源創(chuàng)建實體之后,才能進行。

第22頁共22

隨著技術(shù)發(fā)展,在執(zhí)行一些細小任務(wù)時,本身無需分配單獨資

源時(多個任務(wù)共享同一組資源即可,比如所有子進程共享父進程

的資源),進程的實現(xiàn)機制依然會繁瑣的將資源分割,這樣造成浪

費,而且還消耗時間。后來就有了專門的多任務(wù)技術(shù)被創(chuàng)造出來一

一線程。

線程的特點就是在不需要獨立資源的情況下就可以運行。如此一來

會極大節(jié)省資源開銷,以及處理時間。

1.好了,前面的一段文字是簡要引入兩個名詞,即進程和線程。本

文討論目標是解釋清楚進程和線程的區(qū)別,關(guān)于二者的技術(shù)實現(xiàn),

請讀者查閱相關(guān)資料。

下面我們開始重點討論本文核心了。從下面幾個方面闡述進程

和線程的區(qū)別。

1).二者的相同點

2).實現(xiàn)方式的差異

3).多任務(wù)程序設(shè)計模式的區(qū)別

4).實體間(進程間,線程間,進線程間)通信方式的不同

5).控制方式的異同

6).資源管理方式的異同

第23頁共23

7).個體間輩分關(guān)系的迥異

8).進程池與線程池的技術(shù)實現(xiàn)差別

接下來我們就逐個進行解釋。

1).二者的相同點

無論是進程還是線程,對于程序員而言,都是用來實現(xiàn)多任務(wù)

并發(fā)的技術(shù)手段。二者都可以獨立調(diào)度,因此在多任務(wù)環(huán)境下,功

能上并無差異。并且二者都具有各自的實體,是系統(tǒng)獨立管理的對

象個體。所以在系統(tǒng)層面,都可以通過技術(shù)手段實現(xiàn)二者的控制。

而且二者所具有的狀態(tài)都非常相似。而且,在多任務(wù)程序中,子進

程(子線程)的調(diào)度一般與父進程(父線程)平等競爭。

其實在Linux內(nèi)核2.4版以前,線程的實現(xiàn)和管理方式就是完

全按照進程方式實現(xiàn)的。在2.6版內(nèi)核以后才有了單獨的線程實

現(xiàn)。

第24頁共24

嵋狀態(tài)圖

2).實現(xiàn)方式的差異

進程是資源分配的基本單位,線程是調(diào)度的基本單位。

這句經(jīng)典名言已流傳數(shù)十年,各種操作系統(tǒng)教材都可見此描述。

確實如此,這就是二者的顯著區(qū)別。讀者請注意“基本”二字。相

信有讀者看到前半句的時候就在心里思考,“進程豈不是不能調(diào)

第25頁共25

度?”,非也!進程和線程都可以被調(diào)度,否則多進程程序該如何

運行呢!

只是,線程是更小的可以調(diào)度的單位,也就是說,只要達到線程的

水平就可以被調(diào)度了,進程自然可以被調(diào)度。它強調(diào)的是分配資源

時的對象必須是進程,不會給一個線程單獨分配系統(tǒng)管理的資源。

若要運行一個任務(wù),想要獲得資源,最起碼得有進程,其他子任務(wù)

可以以線程身份運行,資源共享就行了。

簡而言之,進程的個體間是完全獨立的,而線程間是彼此依存

的。多進程環(huán)境中,任何一個進程的終止,不會影響到其他進程。

而多線程環(huán)境中,父線程終止,全部子線程被迫終止(沒有了資源)。

而任何一個子線程終止一般不會影響其他線程,除非子線程執(zhí)行了

exit。系統(tǒng)調(diào)用。任何一個子線程執(zhí)行exit。,全部線程同時滅

亡。

其實,也沒有人寫出只有線程而沒有進程的程序。多線程程序

中至少有一個主線程,而這個主線程其實就是有main函數(shù)的進程。

它是整個程序的進程,所有線程都是它的子線程。我們通常把具有

多線程的主進程稱之為主線程。

從系統(tǒng)實現(xiàn)角度講,進程的實現(xiàn)是調(diào)用fork系統(tǒng)調(diào)用:

pidtfork(void);

第26頁共26

線程的實現(xiàn)是調(diào)用clone系統(tǒng)調(diào)用:

intclone(int(*fn)(void*),void*child_stack,intf

lags,void*arg,

/*pidt*ptid,structuserdesc*tls,pidt*ctid*/

);

其中,fork。是將父進程的全部資源復(fù)制給了子進程。而線程

的clone只是復(fù)制了一小部分必要的資源。在調(diào)用clone時可以通

過參數(shù)控制要復(fù)制的對象??梢哉f,fork實現(xiàn)的是clone的加強

完整版。當然,后來操作系統(tǒng)還進一步優(yōu)化fork實現(xiàn)一一寫時復(fù)

制技術(shù)。在子進程需要復(fù)制資源(比如子進程執(zhí)行寫入動作更改父

進程內(nèi)存空間)時才復(fù)制,否則創(chuàng)建子進程時先不復(fù)制。

實際中,編寫多進程程序時采用fork創(chuàng)建子進程實體。而創(chuàng)建

線程時并不采用clone系統(tǒng)調(diào)用,而是采用線程庫函數(shù)。常用線程

庫有Linux-Native線程庫利POSIX線程庫。其中應(yīng)用最為廣泛的

是POSIX線程庫。因此讀者在多線程程序中看到的是pthread_cre

ate而非cloneo

我們知道,庫是建立在操作系統(tǒng)層面上的功能集合,因而它的功能

都是操作系統(tǒng)提供的。由此可知,線程庫的內(nèi)部很可能實現(xiàn)了clo

第27頁共27

ne的調(diào)用。不管是進程還是線程的實體,都是操作系統(tǒng)上運行的

實體。

最后,我們說一下vfork()o這也是一個系統(tǒng)調(diào)用,用來創(chuàng)

建一個新的進程。它創(chuàng)建的進程并不復(fù)制父進程的資源空間,而是

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論