第五篇筆記竟然拖了一個禮拜啊...
不過這也是沒辦法的,最近比牛仔還要忙啊
為了學校事務已經很久沒辦法好好的睡一覺了

第四次筆記已經更新某些錯誤的部份
如mount或vim的指令輸入方法

《關於上課用書》
Google圖書搜尋中有"Beginning Linux Programming"這本書的預覽
但並不是所有內容都可見
其實這本書的電子書網路上要找到太容易了...

《第三章 看linux的檔案跟目錄並用程式操控他》
我很努力做筆記了,不過由於上課就是這麼零散,我也沒辦法

‧在Linux每一個指令都是一個檔案
最常用的是open, close, read, write, ioctl

cp ../hello.c . - 複製上一層的hello.c檔案到此處

‧輸入ll -i,前面會顯示inode號碼,每個block有一個號碼

 

‧補充一下ls的其他幾個參數
ll -k - 檔案大小以kb表示(參見下圖)
ll -m - 變成人類容易看的大小表示
ll -R - 路徑要不要recursive

 

‧輸入指令bc,可以寫程式(例如費式數列)
但老師講太快所以沒抄到什麼
詳情還是請參考man bc


《link 捷徑》
ln hello.c aa - 產生捷徑aa指到hello.c
ln -s hello.c bb - 產生捷徑bb指到hello.c

以上兩個指令的結果其實相同
唯一差別在aa的inode是相同的,稱為hard-link
bb的inode不同,稱為symbolic-link
聽說hard-link只能在同一層?

權限的第一個字是l代表為捷徑

《補充:權限的第一個字》
d - 目錄
c - char device
b - block device
s - socket
p - fifo

權限後面有個1,2等字樣,那是代表有多少檔案連到他
輸入rm aa把捷徑aa砍掉,count就會減少一

輸入rm hello.c;cat bb(註:有分號代表分開的兩行指令)
由於原檔案已經不在了,所以bb就找不到了

 

‧回到最上層的方法
1. cd
2. cd~

/dev/console

/dev/tty  終端機
是個alias,控制鍵盤或螢幕
ex. ls -R | more

 

/dev/null
是個黑洞,東西丟進去就不見了
當訊息不想干擾使用者時可用

‧產生空檔案的指令
1. touch cc
2. cp /dev/null dd - 把什麼都沒有的東西複製到dd

dd if=/dev/zero of=file300M bs=1k count=300k
可以產生一個300mb的檔案(似乎要有管理者權限)

‧觀看裡面的內容
ll file300M
xxd -g1 file300M | head

可以看到裡面每一個都是0

 

‧空的檔案可以使用mount指令模擬
但這部分我幾乎都沒抄到=__=

‧system call - 系統呼叫

‧device driver - 驅動程式
先用cd /lib/modules進入驅動程式目錄後
輸入lsmod可看到它載入了多少驅動程式

可以把不重要的驅動程式關閉讓他執行效能加快
例如fan是風扇,但現在是虛擬系統,不需要這種東西
輸入 lsmod | grep fan 找尋風扇那一行
輸入 rmmod fan 再去看,風扇已經不見了,少了4k

除了fan(風扇)外還有battery(電池)、floppy(軟碟機)等東西都不需要
自己微調需要載入的驅動程式可以加快電腦開啟速度

 

‧ioctl - 送特殊訊息給特殊應用程式
例如送風扇轉速電壓等,跟硬體有關

‧每次呼叫system call效率會很低
library function,有buffer會比較快

‧用man查詢資料的編號
man 2 read
2可以省略,因為read只有一個
man 3 printf
3不能省略,因為printf有很多個

‧low-level file access

《程式指令》

◇write
打開chapter03的simple_write.c
我們來把程式碼作點修改以符合我們的需求
請記得改完後要存檔並且編譯

 

write的第一個參數,1為標準輸出,2為錯誤
第二個參數是文字,最後一個參數為總共要顯示幾個字元
像是我們在第二個參數後面加了字,但是第三個參數沒變
所以超過21個字元後的字會被截掉
要完整顯現的話,將第三個參數從21改成27即可

顯示完後會回傳顯示多少字的值
由於21不等於18,所以會接著印下面的錯誤訊息

再來嘗試一下將資料輸出到檔案會顯示什麼樣的結果
./simple_write >out
cat out
./simple_write 2> err
cat err
./simple_write >& both
cat both

 

◇read
read如果回傳值為-1代表有錯誤

每次執行simple_read都要輸入指令好麻煩
如果指令下這樣 echo hello there | ./simple_read
就會自動把hello there字樣傳到simple_read

./simple_read < draft1.txt
結果simple_read只能讀前半部的資料
後半部就完全讀不出來,為何呢?
因為draft1.txt有713 bytes
但simple_read的buffer只有128 bytes

 

◇open

umask
>0022
touch u0022
umask 002
umask

>0002
touch u002
ll



發現u0022的權限會比較少
這段程式碼的意思之後再來補充

open的權限設定請看man的說明

 

◇close
int close(int fildes);

《比較檔案差異》
diff copy_system.c copy_block.c
這兩個程式的差別在一個用byte一個用block輸出

 

‧來測試一下這兩個程式範例的不同處
用前面的語法產生一個1M檔案叫file.in

先比較一下兩種不同的time格式
TIMEFORMAT="" time ./copy_system
time ./copy_system




再來用time來判斷這兩個程式的不同
用學校的電腦結果如下

time ./copy_system
>real    0m52.650s
>user    0m7.676s
>sys    0m44.559s

time ./copy_block
>real    0m0.102s
>user    0m0.008s
>sys    0m0.068s

很明顯的copy_system的程式慢太多了
同樣是copy,寫法不同速度差異很大

‧執行底下的範例程式
./printdir | most
這個程式會將底下的目錄跟檔案用遞迴全部顯示出來

《期中考題目類型》
aa | bb
aa能把資料傳給bb,bb可以抓資料

《本次作業》
改寫printdir程式,具體要求在課程網頁上
其中一項為可以傳參數改變顯示的目錄
以下是老師的範例

int main(int argc, char *argv[]){
{
    printf("Directory scan of /home:\n");

    if (argc == 2){
        printdir(argv[1],0);
    }else{
        printdir("/home",0);
    }

    printf("done.\n");

    exit(0);
}

可以輸入./printdir /ect/network來測試

《取得系統的原始碼》
我們先用which ls來找到ls這個程式放在哪
再輸入dpkg -S /bim/ls來看這個程式原始碼放在哪個套件中
得知是coreutils後
輸入apt-get source coreutils下載套件!



下載完後還得自己解壓縮
先進入目錄 cd coreutils-6.10/
看下載回來的檔案執行不同指令解壓縮
coreutils-6.10.tar.gz -> tar xzvf coreutils-6.10.tar.gz
coreutils-5.97.tar.bz2 -> tar xjvf coreutils-5.97.tar.bz2

解壓縮完後,輸入以下指令即可觀看ls的原始檔了
cd coreutils-6.10/
cd src
cat ls.c


arrow
arrow
    全站熱搜

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