UNIX期末總復習
(1)什么是操作系統(tǒng)涝登?什么是UNIX操作系統(tǒng)趟紊?什么是Linux操作系統(tǒng)氮双?它們之間的關系是怎樣的?
操作系統(tǒng):控制計算機硬件和軟件資源霎匈,對作業(yè)進行合理的調度戴差,以供用戶方便使用的一組軟件的集合。
UNIX操作系統(tǒng)铛嘱,是一個強大的多用戶暖释、多任務操作系統(tǒng),支持多種處理器架構墨吓,按照操作系統(tǒng)的分類球匕,屬于分時操作系統(tǒng)。
Linux肛真,即GNU/Linux谐丢,是一套免費使用和自由傳播的類Unix操作系統(tǒng),是一個基于POSIX和UNIX的多用戶蚓让、多任務乾忱、支持多線程和多CPU的操作系統(tǒng)。
Linux繼承了Unix以網(wǎng)絡為核心的設計思想历极,它能運行主要的UNIX工具軟件窄瘟、應用程序和網(wǎng)絡協(xié)議。
操作系統(tǒng)分為兩大陣營 一邊是windows 一邊是unix linux是一種unix-like操作系統(tǒng)
(2)程序運行時趟卸,堆棧如何變化蹄葱?什么是數(shù)據(jù)幀或活動記錄?bp和sp指針在函數(shù)運行過程中是如何變化的锄列?
https://blog.csdn.net/fang92/article/details/46494665
bp:棧幀指針图云,具體應該是指向當前函數(shù)棧的棧底,是不動的邻邮。實際的作用應該就是類似于一個基址竣况,通過這個基址上棧中變量的尋址。
sp:棧頂指針筒严。
(3)UNIX環(huán)境下編程共同遵循的規(guī)范有哪些丹泉?“Least Surprise”是什么意思情萤?
ISO C
IEEE POSIX
Single UNIX Specification
Least Surprise:在設計界面的時候,盡量做最少的surprise thing
(4)常用的Shell命令摹恨,如ls筋岛、cd、dd晒哄、pwd睁宰、ps、cp揩晴、chown勋陪、chmod、mkdir硫兰、size等的具體用法。
- ls
[root@localhost ~]# ls -a #列出所有文件
[root@localhost ~]# ls -A #列出所有文件但不包括表示當前目錄.和上級目錄..這兩個文件寒锚。
[root@localhost /]# ls -clt #和 -lt參數(shù)一起使用劫映,以時間排序
[root@localhost /]# ls -cl #和-l參數(shù)一起使用,以文件名排序并顯示時間
[root@localhost /]# ls -d /home #僅列出/home目錄本身
[root@localhost /]# ls -l #列出長數(shù)據(jù)串刹前,顯示出文件的屬性與權限等數(shù)據(jù)信息(常用)
- cd
[root@localhost ~]# cd #直接進入個人目錄
[root@localhost ~]# cd destination #進入到目標目錄
- dd:用指定大小的塊拷貝一個文件泳赋,并在拷貝的同時進行指定的轉換。
[root@localhost ~]#dd if=/root/1Gb.file bs=64k | dd of=/dev/null #測試寫的速度
/dev/null 外號叫無底洞喇喉,你可以向它輸出任何數(shù)據(jù)祖今,它通吃叽掘,并且不會撐著击你!
/dev/zero,是一個輸入設備蚪黑,你可你用它來初始化文件膏斤。該設備無窮盡地提供0!
- pwd
zhuzhu@zhuzhu-ThinkPad:~$ pwd
/home/zhuzhu
-
ps(Process Status)查看Process的詳細狀態(tài)
[root@localhost ~]# ps -a #列出當前終端機的所有進程 [root@localhost ~]# ps -A #列出所有進程
cp(copy)拷貝文件
[root@DB-Server kerry]# cp file1 file2 #拷貝文件file1到當前目錄并更名為file2
[root@DB-Server ~]# cp /home/kerry/* /tmp 拷貝kerry目錄下文件到tmp目錄下
-
chown
chown將指定文件的擁有者改為指定的用戶或組徐绑,用戶可以是用戶名或者用戶ID;組可以是組名或者組ID莫辨;文件是以空格分開的要改變權限的文件列表傲茄,支持通配符。系統(tǒng)管理員經(jīng)常使用chown命令沮榜,在將文件拷貝到另一個用戶的名錄下之后盘榨,讓用戶擁有使用該文件的權限。
[root@localhost test6]# chown 擁有者:群組 filename
-
chmod
r=4蟆融,w=2草巡,x=1
若要rwx屬性則4+2+1=7; 若要rw-屬性則4+2=6振愿; 若要r-x屬性則4+1=5捷犹。
[root@localhost test6]# chmod ug=rwx,o=x file
- mkdir
[root@localhost test6]#mkdir test #創(chuàng)建一個空目錄
[root@localhost test6]#mkdir -m 777 test3 #創(chuàng)建一個權限為777的目錄
- size
(5)什么是管道弛饭?哪些文件參與了管道?在命令行下和通過編程如何實現(xiàn)管道萍歉?
https://blog.csdn.net/oguro/article/details/53841949
管道是一種最基本的IPC機制侣颂,作用于有血緣關系的進程之間,完成數(shù)據(jù)傳遞枪孩。調用pipe系統(tǒng)函數(shù)即可創(chuàng)建一個管道憔晒。有如下特質:
其本質是一個偽文件(實為內核緩沖區(qū))
兩個文件描述符引用,一個表示讀端蔑舞,一個表示寫端拒担。
規(guī)定數(shù)據(jù)從管道的寫端流入管道,從讀端流出攻询。
管道的局限性:
① 數(shù)據(jù)自己讀不能自己寫从撼。
② 數(shù)據(jù)一旦被讀走,便不在管道中存在钧栖,不可反復讀取低零。
③ 由于管道采用半雙工通信方式。因此拯杠,數(shù)據(jù)只能在一個方向上流動掏婶。
④ 只能在有公共祖先的進程間使用管道。
命令行 : command 1 | command 2 | command 3 ……
在linux中有些命令可以直接用于管道命令中潭陪,有些則不可以雄妥,對于不可以直接用于管道的命令需要借助xargs命令:
find ./ -type f | xargs md5sum >> md5_rc1.txt
find ./ -type f -print| xargs md5sum >> md5_rc1.txt
find ./ -type f -print0| xargs -0 md5sum >> md5_rc1.txt
而對于可以直接用于管道的命令,不需要xargs直接寫就可以依溯,直接寫在管道符后面就能判斷老厌,例如要確定wc命令是不是可以直接用于管道的命令
ls -l | wc -l
對于常用的可以直接用于管道的命令,主要有:
cut
grep
sort
uniq
wc
tee
tr
col
join
paste
expand
xargs
編程:pipe函數(shù)
創(chuàng)建管道
int pipe(int pipefd[2]); 成功:0誓沸;失斆纷:-1,設置errno
函數(shù)調用成功返回r/w兩個文件描述符拜隧。無需open宿百,但需手動close。規(guī)定:fd[0] → r洪添; fd[1] → w垦页,就像0對應標準輸入,1對應標準輸出一樣干奢。向管道文件讀寫數(shù)據(jù)其實是在讀寫內核緩沖區(qū)痊焊。
管道創(chuàng)建成功以后,創(chuàng)建該管道的進程(父進程)同時掌握著管道的讀端和寫端。如何實現(xiàn)父子進程間通信呢薄啥?通吃穑可以采用如下步驟:
父進程調用pipe函數(shù)創(chuàng)建管道,得到兩個文件描述符fd[0]垄惧、fd[1]指向管道的讀端和寫端刁愿。
父進程調用fork創(chuàng)建子進程,那么子進程也有兩個文件描述符指向同一管道到逊。
父進程關閉管道讀端铣口,子進程關閉管道寫端。父進程可以向管道中寫入數(shù)據(jù)觉壶,子進程將管道中的數(shù)據(jù)讀出脑题。由于管道是利用環(huán)形隊列實現(xiàn)的,數(shù)據(jù)從寫端流入管道铜靶,從讀端流出叔遂,這樣就實現(xiàn)了進程間通信。
(6)常規(guī)文件和目錄文件的差別是什么争剿?常規(guī)文件掏熬、目錄文件、軟鏈接文件的長度如何計算秒梅?
普通文件:存儲普通數(shù)據(jù),一般就是字符串舌胶。
目錄文件:存儲了一張表捆蜀,該表就是該目錄文件下,所有文件名和inode的映射關系幔嫂。
從父目錄中獲得本文件的inode號---->找到inode-table表中找到這個inode號對應的數(shù)據(jù)域中的起點以及其他信息---->去這個數(shù)據(jù)域中讀取該文件的內容(普通文件的內容一般是字符串辆它,目錄文件的內容是一張表)
關鍵就是訪問任何一個文件,要看是否能搞到inode號履恩,搞不到就沒轍了锰茉。搞到inode就好說了,拿著inode號去inode表中查找即可切心,最后找到數(shù)據(jù)域飒筑,那么就可以找到文件的內容了 然后整個過程這不僅僅跟本文件權限有關,還跟它的父目錄(還有父目錄的父目錄...)權限有關(是否能搞到本文件的inode)
體現(xiàn)在命令上:(話說這才是最實際的表象)
======
對于普通文件來說绽昏,rwx的意義是: r:可以獲得這個普通文件的名字和內容协屡。 w:可以修改這個文件的內容和文件名∪可以刪除該文件肤晓,但是用戶會得到是否刪除寫保護文件的prompt。 x:該文件是否具有被執(zhí)行的權限。 ======
對于目錄文件來說补憾,rwx的意義是: r-x:可以進入cd該目錄漫萄,可以獲得該目錄下存儲情況,但是不能修改這個目錄內部存儲的文件(目錄)的名字盈匾,也不能在該目錄下新建文件和目錄 -wx:可以進入cd該目錄腾务,但是看不到該目錄下的存儲情況(ls不可用),可以往該目錄下添加威酒、修改窑睁、刪除文件】拢可以通過cat來讀取該目錄下的文件or目錄的內容担钮,由于得不到該目錄下存儲了那些文件,在不知情的情況下只能通過猜尤仍,cat + 文件名獲得文件內容箫津,所以這樣依然不保密。 --x:可以進入cd該目錄宰啦,看不到存儲情況苏遥,也不能往該目錄下添加、修改赡模、刪除文件田炭。但是依然可以通過cat + xx(猜)來獲得該目錄下的文件的內容。 rw-:不能進入cd該目錄漓柑,用ls僅僅可以獲得文件名和目錄名教硫,因為獲取不到這些文件的inode號,當然也不能獲得該目錄下的文件的內容辆布。不能往該目錄下添加瞬矩、修改、刪除文件锋玲。
======
https://blog.csdn.net/mrjy1475726263/article/details/34436769
查看長度的話可以使用lseek函數(shù)來進行操作
(7)怎樣移動文件景用?在命令行方式下和通過編程如何實現(xiàn)?
命令行:
[root@localhost test6]#mv [-fiv] sourefile destination
參數(shù)說明:
-f:force惭蹂,強制直接移動而不詢問
-i:若目標文件(destination)已經(jīng)存在伞插,就會詢問是否覆蓋
-u:若目標文件已經(jīng)存在,且源文件比較新剿干,才會更新
?
例子:將/test1目錄下的file1復制到/test3目錄蜂怎,并將文件名改為file2
[root@localhost test6]#mv /test1/file1 /test3/file2
編程:作業(yè)1
通過read和write來實現(xiàn)拷貝文件
(8)怎樣利用gcc編譯源文件?gcc的-o置尔、-e杠步、-static、-Wall等選項的具體含義是什么?怎樣使用幽歼?
http://www.cnblogs.com/qytan36/archive/2010/05/25/1743955.html
[root@localhost test6]#gcc [-fiv] test.c
參數(shù)說明:
-o:指定生成的輸出文件朵锣;
-E:僅執(zhí)行編譯預處理;
-S:將C代碼轉換為匯編代碼甸私;
-wall:顯示警告信息诚些;
?
將test.c預處理、匯編皇型、編譯并鏈接形成可執(zhí)行文件test诬烹。-o選項用來指定輸出文件的文件名。
gcc test.c -o test
?
將test.c預處理輸出test.i文件弃鸦。
gcc -E test.c -o test.i
?
將預處理輸出文件test.i匯編成test.s文件绞吁。
gcc -S test.i
將匯編輸出文件test.s編譯輸出test.o文件。
gcc -c test.s
?
多源文件的編譯方法
多個文件一起編譯
gcc testfun.c test.c -o test
?
分別編譯各個源文件唬格,之后對編譯后輸出的目標文件鏈接家破。
gcc -c testfun.c #將testfun.c編譯成testfun.o
gcc -c test.c #將test.c編譯成test.o
gcc -o testfun.o test.o -o test #將testfun.o和test.o鏈接成test
(9)什么是動態(tài)鏈接庫?什么是靜態(tài)鏈接庫购岗?怎樣用靜態(tài)鏈接的方式編譯C程序汰聋?
靜態(tài)庫是在鏈接階段被鏈接的,所以生成的可執(zhí)行文件就不受庫的影響了喊积,即使庫被刪除了烹困,程序依然可以成功運行。
有別于靜態(tài)庫乾吻,動態(tài)庫的鏈接是在程序執(zhí)行的時候被鏈接的韭邓。所以,即使程序編譯完溶弟,庫仍須保留在系統(tǒng)上,以供程序運行時調用瞭郑。
gcc -static
(10)什么是文件系統(tǒng)辜御?UNIX的文件系統(tǒng)有什么特點?有哪些具體的文件類型屈张?
文件系統(tǒng)是操作系統(tǒng)用于明確存儲設備(常見的是磁盤擒权,也有基于NAND Flash的固態(tài)硬盤)或分區(qū)上的文件的方法和數(shù)據(jù)結構;即在存儲設備上組織文件的方法阁谆。 Unix可以把一個能隨機存取的存儲介質(如:硬盤碳抄、軟盤和光盤)上的存儲空間劃分成一致多個區(qū)域,每個區(qū)域都可以像獨立的物理設備一樣單獨進行管理和數(shù) 據(jù)存取场绿,這樣的存儲區(qū)域剖效,即是邏輯設備。在邏輯設備上按照一定的格式進行劃分,就構成了邏輯文件系統(tǒng)璧尸,簡稱文件系統(tǒng)咒林。
普通文件 這種文件包含了某種形式的數(shù)據(jù),這些數(shù)據(jù)無論是文件還是二進制對于 UNIX 內核而言都是一樣的。對普通文件內容的解釋有處理該文件的應用程序進行爷光。
目錄文件 目錄文件包含了其他文件的名字以及指向與這些文件有關信息的指針垫竞。對一個目錄文件具有讀權限的任一進程都可以讀取該目錄的內容,但是只有內核才能直接寫目錄文件。
塊特殊文件 這種文件類型提供對設備帶緩沖的訪問,每次訪問以固定長度為單位進行蛀序。
字符特殊文件 這種文件類型提供對設備不帶緩沖的訪問,每次訪問長度可變欢瞪。系統(tǒng)中的所有設備要么是字符特殊文件,要么是塊特殊文件。
FIFO 這種類型文件用于進程間通信徐裸。也稱為命名管道(namedpipe)遣鼓。
套接字(socket) 這種文件類型用于進程間的網(wǎng)絡通信。
符號鏈接(symbolic link) 這種文件類型指向另一個文件倦逐。
(11)什么是文件的訪問權限譬正?使用chmod命令怎樣改變訪問權限?chmod 0777是什么意思檬姥?
在linux中的每一個文件或目錄都包含有訪問權限曾我,這些訪問權限決定了誰能訪問和如何訪問這些文件和目錄 chmod [mode] 文件名(其中mode可用二進制數(shù)表示) u :目錄或者文件的當前的用戶 g :目錄或者文件的當前的群組 o :除了目錄或者文件的當前用戶或群組之外的用戶或者群組 (u) (g) (o)
— = 0 rwx = 7 0777–>-rwx rwx rwx 對所有用戶開放所有權限
(12)什么是文件操作是的偏移量(offset)?它的數(shù)據(jù)類型是什么健民?操作系統(tǒng)中文件的最大長度取決于什么抒巢?
https://blog.csdn.net/MonroeD/article/details/52771027?locationNum=10
每個打開的文件都有一個與其相關聯(lián)的“當前位移量”,它是一個非負整數(shù)秉犹,用于度量從文件開始處計算的字節(jié)數(shù)蛉谜,通常,讀寫操作都從當前文件位移量開始崇堵,并使位移量增加所讀或所寫的字節(jié)數(shù)型诚。按系統(tǒng)默認,當打開一個文件時鸳劳,除非指定O_APPEND選項狰贯,否則該位移量被設置為0,注意lseek函數(shù)只修改文件的當前位移量赏廓,沒有進行任何I/O操作涵紊,文件位移量可以大于文件的當前長度
空洞文件?幔摸、
取決與offset的位數(shù)摸柄?
(13)什么是管道?什么是文件重定向既忆?dup()驱负、dup2()函數(shù)怎樣使用嗦玖?
管道:UNIX操作系統(tǒng)進程間通信的一種方式,一個進程的輸出直接傳遞到另一個進程作為輸入
文件重定向 :在linux中重定向用符號“>”表示电媳,語法一般是 源文件 > 目標文件
https://blog.csdn.net/u011541946/article/details/71698645
int dup(int oldfd);
int dup2(int oldfd, int newfd);
兩個函數(shù)的作用 復制一個現(xiàn)存的文件描述符踏揣。
當調用dup函數(shù)時,內核在進程中創(chuàng)建一個新的文件描述符匾乓,此描述符是當前可用文件描述符的最小數(shù)值捞稿,這個文件描述符指向oldfd所擁有的文件表項。
dup2和dup的區(qū)別就是可以用newfd參數(shù)指定新描述符的數(shù)值拼缝,如果newfd已經(jīng)打開娱局,則先將其關閉。如果newfd等于oldfd咧七,則dup2返回newfd, 而不關閉它衰齐。dup2函數(shù)返回的新文件描述符同樣與參數(shù)oldfd共享同一文件表項。
實際上继阻,調用dup(oldfd)等效于耻涛,fcntl(oldfd, F_DUPFD, 0)
而調用dup2(oldfd, newfd)等效于,close(oldfd)瘟檩;fcntl(oldfd, F_DUPFD, newfd)抹缕;
(14)什么是文件的靜態(tài)屬性和動態(tài)屬性(文件描述符屬性)?在文件描述符屬性中墨辛,哪些是由進程維護的卓研?哪些是由內核維護的?
圖解
理解具體情況睹簇,需要了解由內核維護的3個數(shù)據(jù)結構:
進程級文件描述符表(file descriptor table) 系統(tǒng)級打開文件表(open file table) 文件系統(tǒng)i-node表(i-node table) 這3個數(shù)據(jù)結構之間的關系如下圖所示:內核使用三種數(shù)據(jù)結構表示打開的文件,分別是文件描述符表奏赘、文件表和 V 節(jié)點表。 (1) 每個進程在進程表中都有一個記錄項,記錄項中包含有一張打開文件描述符表,每個描述符占用一項太惠。與每個文件描述符相關聯(lián)的是: (a) 文件描述符標志磨淌。 (b) 指向一個文件表項的指針。 (2) 內核為所有打開文件維持一張文件表凿渊。每個文件表項包含: (a) 文件狀態(tài)標志(讀伦糯、寫、添寫嗽元、同步和非阻塞等)。 (b) 當前文件偏移量喂击。 (c) 指向該文件 V 節(jié)點表項的指針剂癌。 (3) 每個打開文件(或設備)都有一個 v 節(jié)點(v-node)結構。v 節(jié)點包含了文件類型和對此文件進行各種操作的函數(shù)的指針翰绊。v 節(jié)點還包含了從磁盤讀取的 i 節(jié)點(i-node)的信息,i 節(jié)點信息包含了文件的所有者佩谷、文件長度旁壮、文件所在的設備、指向文件的實際數(shù)據(jù)塊在磁盤上的所在位置的指針等谐檀。
參考鏈接:
(15)什么是會話(Session)抡谐、進程組?它們之間有什么關系桐猬?
進程組是一個或多個進程的集合麦撵,通常它們與一組作業(yè)相關聯(lián),可以接受來自同一終端的各種信號溃肪。每個進程組都有唯一的進程組ID(整數(shù)免胃,也可以存放在pid_t類型中)。 會話是一個或多個進程組的集合惫撰。
每個進程組都有一個組長進程羔沙,組長進程的標識是進程組ID等于其進程ID。
進程調用setsid函數(shù)創(chuàng)建一個新的會話厨钻,該進程會變成新會話的會話首進程扼雏,該進程也成為一個新進程組的組長進程。如果此調用進程已經(jīng)是一個進程組的組長夯膀,則此函數(shù)返回出錯诗充。 調用getsid函數(shù)返回調用進程的回話首進程的進程組id。
(16)父進程和子進程之間是什么關系棍郎?怎樣在父子進程之間共享文件描述符其障?
由fork創(chuàng)建的新進程被稱為子進程(child process)。該函數(shù)被調用一次涂佃,但返回兩次励翼。兩次返回的區(qū)別是子進程的返回值是0,而父進程的返回值則是新進程(子進程)的進程 id辜荠。將子進程id返回給父進程的理由是:因為一個進程的子進程可以多于一個汽抚,沒有一個函數(shù)使一個進程可以獲得其所有子進程的進程id。對子進程來說伯病,之所以fork返回0給它造烁,是因為它隨時可以調用getpid()來獲取自己的pid;也可以調用getppid()來獲取父進程的id午笛。(進程id 0總是由交換進程使用惭蟋,所以一個子進程的進程id不可能為0 )。 fork之后药磺,操作系統(tǒng)會復制一個與父進程完全相同的子進程告组,雖說是父子關系,但是在操作系統(tǒng)看來癌佩,他們更像兄弟關系木缝,這2個進程共享代碼空間便锨,但是數(shù)據(jù)空間是互相獨立的,子進程數(shù)據(jù)空間中的內容是父進程的完整拷貝我碟,指令指針也完全相同放案,子進程擁有父進程當前運行到的位置(兩進程的程序計數(shù)器pc值相同,也就是說矫俺,子進程是從fork返回處開始執(zhí)行的)吱殉,但有一點不同,如果fork成功恳守,子進程中fork的返回值是0考婴,父進程中fork的返回值是子進程的進程號,如果fork不成功催烘,父進程會返回錯誤沥阱。可以這樣想象伊群,2個進程一直同時運行考杉,而且步調一致,在fork之后舰始,他們分別作不同的工作崇棠,也就是分岔了。這也是fork為什么叫fork的原因 至于那一個最先運行丸卷,可能與操作系統(tǒng)調度算法有關枕稀,而且這個問題在實際應用中并不重要,如果需要父子進程協(xié)同谜嫉,可以通過原語的辦法解決萎坷。
父子進程共享文件描述符的條件:在fork之前打開文件。
如何共享文件描述符:父子進程共享文件描述符- 洋羽翔
(17)在一個進程中沐兰,文件描述符的增長規(guī)律是怎樣的哆档?例如,如果已經(jīng)有0住闯、1瓜浸、2、6這樣幾個文件描述符比原,那么用open()返回的下一個文件描述符是什么插佛?
- 由open和openat函數(shù)返回的文件描述符一定是最小的未用描述符數(shù)值
3
(18)什么是process id?父進程和子進程的pid之間有什么關系量窘?(通常子進程的pid要大于父進程的pid)
process id:進程標識符雇寇,unix系統(tǒng)中用來唯一標識每個進程,是一個非負整數(shù)。
子進程總是可以調用getppid來獲得父進程的pid,父進程在調用fork函數(shù)時可以獲得子進程的pid.
(19)什么是C語言程序的入口函數(shù)谢床?在C Startup Routine(start.S)中接受的main函數(shù)原型是什么?
Main函數(shù)厘线。(當內核執(zhí)行C程序時识腿,在調用main前先調用一個特殊的啟動例程,可執(zhí)行程序文件將此啟動例程設置為程序的起始地址造壮。啟動例程從內核取得* 命令行參數(shù)和環(huán)境變量值渡讼,然后為按上述方式調用main函數(shù)做好安排。)
Int main(int argc, char * argv[1]),argc是命令行參數(shù)的數(shù)目耳璧,argv是指向參數(shù)的各個指針所構成的數(shù)組成箫。
(20)什么是系統(tǒng)調用?什么是C語言庫函數(shù)旨枯?它們之間有什么區(qū)別和聯(lián)系蹬昌?
系統(tǒng)調用(system call),指運行在用戶空間的應用程序向操作系統(tǒng)內核請求某些服務的調用過程攀隔。 系統(tǒng)調用提供了用戶程序與操作系統(tǒng)之間的接口皂贩。一般來說,系統(tǒng)調用都在內核態(tài)執(zhí)行昆汹。由于系統(tǒng)調用不考慮平臺差異性明刷,由內核直接提供,因而移植性較差(幾乎無移植性)满粗。
庫函數(shù)(library function)辈末,是由用戶或組織自己開發(fā)的,具有一定功能的函數(shù)集合映皆,一般具有較好平臺移植性挤聘,通過庫文件(靜態(tài)庫或動態(tài)庫)向程序員提供功能性調用。程序員無需關心平臺差異劫扒,由庫來屏蔽平臺差異性檬洞。
系統(tǒng)調用實際上就是指最底層的一個調用,在linux程序設計里面就是底層調用的意思沟饥。面向的是硬件添怔。而庫函數(shù)調用則面向的是應用開發(fā)的,相當于應用程序的api.
采用這樣的方式有很多種原因贤旷,第一:雙緩沖技術的實現(xiàn)广料。第二,可移植性幼驶。第三艾杏,底層調用本身的一些性能方面的缺陷。第四:讓api也可以有了級別和專門的工作面向盅藻。
(21)什么是inode购桑?里面存放什么信息畅铭?文件的文件名存放在哪里?
inode(index node)就是索引節(jié)點勃蜘,它用來存放檔案及目錄的基本信息硕噩,包含時間、檔名缭贡、使用者及群組等炉擅。inode信息就存儲在磁盤的某個分區(qū)上 inode 包含文件的元信息,具體來說有以下內容: * 文件的字節(jié)數(shù) * 文件擁有者的 User ID * 文件的 Group ID * 文件的讀阳惹、寫谍失、執(zhí)行權限 * 文件的時間戳,共有三個:ctime 指 inode 上一次變動的時間莹汤,mtime 指文件內容上一 次變動的時間快鱼,atime 指文件上一次打開的時間。 * 鏈接數(shù)体啰,即有多少文件名指向這個 inode * 文件數(shù)據(jù) block 的位置 可以用 stat 命令攒巍,查看某個文件的 inode 信息: stat example.txt 總之,除了文件名以外的所有文件信息荒勇,都存在 inode 之中柒莉。
(22)C程序的內存布局是怎樣的?從低地址到高地址依次存放哪些段沽翔?
正文段:由CPU執(zhí)行的機器指令部分兢孝。
初始化數(shù)據(jù)段:程序中需明確地賦初值的變量。
非初始化數(shù)據(jù)段:在程序開始執(zhí)行之前仅偎,內核將此段中的數(shù)據(jù)初始化為0或空指針跨蟹。
棧:自動變量以及每次函數(shù)調用時所需保存的信息都存放在此段中。
堆:通常在堆中進行動態(tài)存儲分配橘沥。 從低地址到高地址依次存放正文窗轩,初始化的數(shù)據(jù),未初始化的數(shù)據(jù)(bss)座咆,堆痢艺,棧。
參考鏈接:
(23)怎樣利用fork()哺呜、exec()舌缤、waitpid()來創(chuàng)建和控制進程?
1.fork 函數(shù)調用一次,但返回兩次。兩次返回的唯一區(qū)別是:子進程返回值為 0,而父進程的返回值是新子進程的進程 ID国撵。fork 函數(shù)返回之后,子進程和父進程都各自繼續(xù)執(zhí)行 fork 調用之后的指令陵吸。子進程是父進程的副本。例如,子進程獲得了父進程數(shù)據(jù)空間介牙、堆和棧的副本走越。 2.當進程調用一種 exec 函數(shù)時,該進程執(zhí)行的程序完全替換為新程序,而新程序則從其 main 函數(shù)開始執(zhí)行。調用 exec 并沒有創(chuàng)建新進程,所以進程 ID 沒有改變,exec 只是用一個新的程序替換了當前進程的正文耻瑟、數(shù)據(jù)、堆和棧段赏酥。 3. waitpid 函數(shù)通過 pid 參數(shù)來控制父進程希望獲取特定進程的終止狀態(tài)信息, ? pid==-1:等待任一子進程,與 wait 函數(shù)等效喳整。 ? pid>0:等待其進程 ID 與 pid 相等的子進程。 ? pid==0:等待其組 ID 等于調用進程組 ID 的任一子進程裸扶。(我們這里不學習進程組) ? pid<-1:等待其組 ID 等于 pid 絕對值的任一子進程框都。 waitpid 函數(shù)返回終止子進程的進程 ID。如果指定的進程或進程組不存在,或者參數(shù) pid 指定的進程不是調用進程的子進程則都將出錯呵晨。
(24)什么是孤兒進程魏保、什么是僵尸進程?它們有什么特點摸屠?怎樣避免產(chǎn)生過多僵尸進程谓罗?
孤兒進程:在其父進程執(zhí)行完成或被終止后仍繼續(xù)運行的一類進程。這些孤兒進程將被init進程(進程號為1)所收養(yǎng)季二,并由init進程對它們完成狀態(tài)收集工作檩咱。 僵尸進程:在UNIX術語中,一個已經(jīng)終止胯舷、但是其父進程尚未對其進行善后處理(獲取終止子進程的有關信息刻蚯、釋放它仍占用的資源)的進程掖棉。 1.終止進程的父進程調用wait和waitpid 2.兩次調用fork()來使新創(chuàng)建的子進程變成孤兒進程泽台,從而直接被1號進程收養(yǎng)曙砂。
(25)什么是前臺進程柒桑?什么是后臺進程慰枕?一個會話有幾個前臺進程組和幾個后臺進程組搞挣?
前臺進程:用戶使用的有控制終端的進程育谬。 后臺進程:也稱守護進程演熟,是運行在后臺的一種特殊進程口蝠。獨立于控制終端并且周期性地執(zhí)行某種任務或者等待處理某些發(fā)生的事件器钟。 一個會話中包含一個前臺進程組,一個或多個后臺進程組妙蔗。
(26)C程序如何退出并返回操作系統(tǒng)傲霸?exit()函數(shù)和exit()/Exit()函數(shù)的差別在哪里?
進程的終止方式有 8 種,其中 5 種為正常終止,它們是 1. 從 main 返回。 2. 調用 exit昙啄。 3. 調用exit 或Exit穆役。 4. 最后一個線程從其啟動例程返回。 5. 最后一個線程調用pthread_exit梳凛。 另外三種為異常終止方式,它們是 1. 調用 abort耿币。 2. 接到一個信號并終止。 3. 最后一個線程對取消請求做出響應韧拒。 這三個函數(shù)用于正常終止一個程序:exit 和Exit 立即進入內核,exit 則先執(zhí)行一些清理處理(包括調用執(zhí)行各終止處理程序,關閉所有標準 I/O 流等),然后進入內核淹接。
(27)exec函數(shù)族包含哪些具體的函數(shù)?其中execve是系統(tǒng)調用叛溢,其它都是普通函數(shù)塑悼。
(28)什么是信號?SIGINT楷掉、SIGSTOP厢蒜、SIGHUP、SIGALARM烹植、SIGQUIT等信號是如何產(chǎn)生的斑鸦?缺省的處理動作是什么?
在計算機科學中,信號是 Unix草雕、類 Unix 以及其他 POSIX 兼容的操作系統(tǒng)中進程間通訊的一種有限制的方式巷屿。它是一種異步的通知機制,用來提醒進程一個事件已經(jīng)發(fā)生。當一個信號發(fā)送給一個進程,操作系統(tǒng)中斷了進程正常的控制流程,此時,任何非原子操作都將被中斷墩虹。如果進程定義了信號的處理函數(shù),那么它將被執(zhí)行,否則就執(zhí)行默認的處理函數(shù)攒庵。
SIGALRM 是鬧鐘信號,當由 alarm 函數(shù)設置的計時器超時后產(chǎn)生此信號。進程的信號屏蔽字復原為調用信號處理屏蔽字之前败晴。
SIGQUIT浓冒,當用戶在終端上按退出鍵(一般是Ctrl+\)時,中斷驅動程序產(chǎn)生此信號尖坤,并發(fā)送給前臺進程組中的所有進程稳懒。
SIGSTOP,作業(yè)控制信號慢味,用以停止一個進程场梆,當用戶在終端上按掛起鍵(一般是Ctrl+Z)時,終端驅動程序產(chǎn)生此信號纯路。
SIGHUP或油,如果終端接口檢測到一個連接斷開,則將此信號送給與該終端相關的控制進程(會話首進程)驰唬。 SIGINT顶岸,當用戶按中斷鍵(一般是Delete或Ctrl+C)時腔彰,終端驅動程序產(chǎn)生此信號并發(fā)送至前臺進程組中的每一個進程。
(29)什么是硬鏈接和軟鏈接(符號鏈接)辖佣?讀取軟連接的函數(shù)是什么霹抛?(readlink)
硬鏈接:通過 i 節(jié)點鏈接使多個目錄項指向同一個文件的這種鏈接類型。
符號鏈接:對一個文件的間接指針卷谈,一般用于將一個文件或整個目錄結構移到文件系統(tǒng)中的另一個位置杯拐。 readlink 函數(shù)打開符號鏈接本身,并讀取該鏈接中的內容(不是該鏈接所引用的文件的內容)。
(30)函數(shù)link()和unlink()的作用是什么世蔗?什么時候文件占用的磁盤空間才會真正被釋放掉端逼?(兩個條件)
Link():創(chuàng)建一個指向現(xiàn)有文件的鏈接;unlink刪除一個現(xiàn)有的目錄項污淋。 打開文件的進程個數(shù)為0裳食; 文件的鏈接計數(shù)為0。
(31)什么是可重入函數(shù)芙沥?怎樣判斷一個函數(shù)是不是可重入函數(shù)?
什么是可重入函數(shù)和不可重入函數(shù)(轉) - Parry Nee - 博客園
一個可重入的函數(shù)簡單來說浊吏,就是:可以被中斷的函數(shù)而昨。就是說,你可以在這個函數(shù)執(zhí)行的任何時候中斷他的運行找田,在任務調度下去執(zhí)行另外一段代 碼而不會出現(xiàn)什么錯誤歌憨。而不可重入的函數(shù)由于使用了一些系統(tǒng)資源,比如全局變量區(qū)墩衙,中斷向量表等等务嫡,所以他如果被中斷的話,可能出現(xiàn)問題漆改,所以這類函數(shù)是 不能運行在多任務環(huán)境下的心铃。
基本上下面的函數(shù)是不可重入的 (1)函數(shù)體內使用了靜態(tài)的數(shù)據(jù)結構; (2)函數(shù)體內調用了malloc()或者free()函數(shù)挫剑; (3)函數(shù)體內調用了標準I/O函數(shù)去扣。
(32)什么是帶緩沖的輸出和不帶緩沖的輸出?當父進程的輸出緩沖區(qū)還未清空時樊破,調用fork創(chuàng)建子進程愉棱,會出現(xiàn)什么情況?
不帶緩沖的輸出:在用戶的進程中對這這類的函數(shù)不會自動緩沖哲戚,每次執(zhí)行就要進行一次系統(tǒng)調用奔滑,針對文件描述符操作。
帶緩沖的輸出:在系統(tǒng)調用的上一層多加了一個緩沖區(qū)顺少,針對流來操作朋其。
如果標準輸出連接到終端設備王浴,則它是行緩沖的,否則它是全緩沖的令宿。即以交互方式運行時叼耙,只得到父進程中printf輸出的行一次,原因是標準輸出緩沖區(qū)由換行符沖洗粒没。但是當將標準輸出重定向到一個文件時筛婉,卻得到printf輸出兩次,原因是在fork之前調用了一次printf癞松,但當調用fork時爽撒,該行數(shù)據(jù)仍在緩沖區(qū)中,然后在將父進程數(shù)據(jù)空間復制到子進程中時响蓉,該緩沖區(qū)數(shù)據(jù)也被復制到子進程中硕勿,此時父進程和子進程各自有了該行內容的緩沖區(qū)。