下禮拜就要交Linux程設的第一次作業了
不過我到現在連一個字都沒還寫="=
最近學校的事情又跟山一樣多,網誌最近也沒時間更新
這篇筆記竟然又拖了一個禮拜
時間真的是不夠用啊...

《umask》
可以設定檔案的預設權限
每個檔案用ls -l看時,前面會有一個權限(像這樣 -rw-rw-rw-)
譬如訪客可不可以執行讀寫動作,這些是用umask控制的

umask影響一個檔案的r(read)、w(write)、x(execute)這三種權限
rwx分別代表4,2,1分
umask預設是777,777-umask=檔案權限
比如說要設定該檔禁止寫入,那就減掉2分
若設定該檔禁止寫入跟執行,那就減掉2+1=3分

以下是範例
umask - 顯示目前預設權限
ll > u0022 - 將ls結果傳到一個新檔案u0022
umask 0002 - 將權限更改成0002
ll > u0002
umask
umask 0066
ll > u0066
umask


最後輸入ll u*看產生的檔案,會發現三個檔案的權限皆不同



另外,使用chmod一樣可以修改權限
詳細內容可以參考鳥哥的私房菜的介紹

《Makefile》
先將第三章的範例copy一份
輸入cp copy_block.c copy2.c
再輸入make全部編譯,他卻不會幫你編譯新產生的copy2.c

 

這是因為make這個語法必須跟目錄底下的Makefile檔案作配合
請先用gedit開啟Makefile,然後找到COPY=那一行
在後面加上copy2這個字串
重新試一次make就可以自動編譯了

《其他指令》

close - 關閉檔案

ioctl - 關閉周邊功能,比方說關閉馬達或螢幕

dd if=/dev/zero of=file.in bs=1024 count=20k
產生一個20MB的空白檔案
至於為什麼這樣是20MB...
bs=block、1024=1k、count=20k,故1k*20k=20M

dd原本是把檔案拷貝到另一檔案(跟cp很像)
但是他可以在途中修改檔案屬性什麼的,比較強
dd還可以做整個硬碟的備份

lstat - 取得檔案資料

‧open跟fopen差異 - 上網找

‧輸入cat -n /etc/passwd
看到下面會有一行joe:x:1000:1000(joe是登入的名字)
前面的1000為UserID,後面的1000為GroupID
至於這有什麼用我也不清楚=__="

‧MSDOS的指令type跟Linux的cat功能是相同的
都是顯示檔案內容

《copy的差異》
前面跟上禮拜的內容相同

time ./copy_system - 超慢
time ./copy_block - 很快
若將copy2.c的1024修改成4096再重新執行一次
速度會更快!

copy_system很慢的原因:要做system call
舉例來說,假設現在某人要為班上每人買一瓶飲料
一次只買一瓶飲料的話要跑五十趟
不如帶個袋子一次把五十瓶飲料裝起來

《lseek讓檔案不用從頭讀》
我們一般讀檔都是從頭讀到尾
其實使用lseek,可以從檔案的途中開始讀取

SEEK_SET  從檔案開始
SEKK_CUR  從目前位置開始
SEEK_END  從最後面開始

先產生一個檔案seq.txt,內容如下
000000000
111111111
222222222
333333333
444444444
555555555
666666666
777777777
888888888
999999999

再新增lseek.c,輸入以下程式碼
(因內容較長,為節省版面請直接下載



(若使用vim,輸入大寫G可以直接排版)

新增完這兩個檔案後,使用makegcc -o lseek lseek.c編譯
再用./lseek seq.txt執行
可以發現顯示的位置會被改變
詳細的程式碼內容就請自行研究了

 

《關於作業printdir.c》
要opendir必須先inlcude兩個東西
請自行參考OPENDIR、CHDIR、lstat、time等等說明
因為這邊大多是論述內容所以抄不了筆記,請自行觀看

printdir.c有一段內容如下
if(strcmp(".",entry->d_name) == 0 || 
    strcmp("..",entry->d_name) == 0)
    continue;

為什麼要跳過.跟..,是因為每個目錄都會有這兩個隱藏檔
如果執行的話又會跳回上一層,變成無限回圈,所以不要做

printf("%*s%s\n",depth,"",entry->d_name);
那個*是留空,會依照depth的數字空多少格


===
ch 4 Linux的環境
===

第四章主要講到檔案後面接的參數argv跟argc

範例:./args left right The center scu CSIM 12345
猜猜看argc會顯示幾個?
答案是8,因為第0個一定是執行檔的名字 ./args
如果把The center用雙引號括起來就只算一個單字
The center --> "The center"

 

範例:./args -l -s --list /etc
argc: 5

範例:./args *
這並不是把*給傳進去,而是把該目錄底下的所有檔案名稱給傳進去
我們知道輸入ls [a-e]*代表只顯示a-e開頭的檔案
輸入./args [a-e]*就是將a-e開頭的檔案名稱傳進args



範例:./args -h --help -i -l myarg -k arg2 "third arg" -z
猜猜看底下有幾個argument跟option(前面有-)?
A: 6 option 4 argument

《getopt》重要!
能夠自動取得檔名後面的參數
作業需要用到這種技巧來改變不同的顯示方式
詳情請看範例argopt.c
輸入範例:./argopt -i -l first -r second

若參數為-f,後面要接檔名,否則會告知option needs a value



兩條dash(--)稱為long option

範例:
ls --author   找作者(作者害羞沒有寫)
ls --version  找版本

 

詳情請看第四章116頁

蕭雲 發表在 痞客邦 PIXNET 留言(0) 人氣()