這篇是補兩個禮拜前的筆記
雖然寫這個筆記一直遭到家人的反對,認為不該浪費時間在這
但我還是覺得應該要把它給寫完
既然決定了,那就一定要做到最好

===
ch 13  Pipes
===
因為老師每個禮拜都會有些內容與上禮拜重複
所以重複的內容我就不再截圖了

‧以前的linux每個指令都是一個檔案
但要如何讓檔案代表該裝置?用mknodmkfifo都可以

‧/tmp目錄是每個人都可以寫入的

‧上課提到了網路喚醒技術(Wake-on-LAN)
跟RFC(request for comments)的相關介紹

‧本次上課第一個範例是建立pipe(這個上次不是上過了?)
pipe是管線,有兩端,一端是寫資料,一端是讀資料

‧輸入法跟程式是利用socket溝通
ls->屬性s是屬於socket(其實這寫過三遍了吧)

‧用fifo傳訊息範例
先用mkfifo myfifo建立fifo
然後輸入echo hello world > myfifo
再用另一視窗輸入cat myfifo
就能把訊息傳過去了
後面加&代表在背景作業(請看上次介紹)

‧如果先輸入cat myfifo的話會被block住
因為沒有讀到東西

‧echo的內容輸入
echo hello again\
second line\
third line

事實上這樣是一行不是三行

14-01.gif
14-02.gif

‧fifo1
建立fifo,可以修改成自己的fifo

‧fifo2
執行要加參數要不要read、write、nonblock(不要block直接回來)
如果直接執行會說需要參數

範例:./fifo2 O_RDONLY O_NONBLOCK &
範例:./fifo2 O_WRONLY

14-03.gif

apropos fifo - 可以查man的說明中,哪些東西跟fifo有關

14-04.gif

查到了,我們這次需要看的是man 4 fifo

14-05.gif

‧fifo3 & fifo4
fifo3是傳個10MB的資料
fifo4是收個10MB的資料
傳10MB資料過去不用一秒就可以結束了,速度超快...

14-06.gif
14-07.gif

‧client & server
一邊輸入./server &
另一邊輸入
for i in 1 2 3 4 5
do
./client &
done
讓他連跑五次client程式
此時輸入ll /tmp/*fifo可以看到產生很多的fifo
但是結束後fifo就消失了

14-08.gif

ins ntp - 安裝 ntp,這是一個對時軟體
ntp對時準確度可以到0.233 nanoseconds

14-09.gif

ntpdate 網址 - 可連到後面的網址作對時
不過執行後卻出現the NTP socket is in use, exiting
因為NTP程式已經開啟了,所以不需要再上網對時一次
因此我們先用/etc/init.d/ntp stop把NTP關了
再次輸入就可以成功對時了.....

可是因為在家連不到學校伺服器
所以底下的截圖是顯示錯誤...
也可以使用中華電信對時網址 clock.hinet.net

14-10.gif

date 11220304 - 後面輸入數字可以更改時間(?)
不過我實際上看並沒有被更改,只會顯示你輸入的時間

14-11.gif

‧最後一次作業原本是程式之間互相傳遞訊息
改成用網路對時比較簡單

‧作業可以參考NTP的程式碼
一樣記得先用sudo bash轉成root權限
apt-get source ntpdate
cd ntp-4.2.4p4+dfsg/


ntpdate的程式碼非常龐大,因為它必須考慮到很多狀況
如果想搜尋目錄底下所有的*.c跟*.h,可以用
find . -name '*.[ch]'

14-12.gif

===
ch 12 Thread
===
在一個程式當中可以有很多條線同時執行,稱為Thread

Windows工作管理員中 [檢視] - [選擇欄位]
加入"執行緒計數"可以看到一個程式用了多少的thread
如IE就用了32個Thread

14-13.gif

thread有自己的stack
所以local variables(區域變數)是不一樣的
但是其shares global variables(全域變數), file descriptors,
signal handlers, current directory state就相同

當輸入是一個thread,處理是一個thread
好處是使用者輸入的時候不會因為處理其他事情而覺得程式沒有回應或很慢
目前的CPU大多是多核心的
如果程式寫多thread,那麼程式執行理論上來講會快
另外一個優點是作業系統從一個thread切換到另一個thread
所需的overlap比process切換少

‧thread1
errno都是共用的
fputs也是用同一個buffer output

編譯時因為用到thread,所以一定要加上-D_REENTRANT-lpthread
不加的話程式無法編譯成功
範例:gcc -D_REENTRANT -o thread1a thread1a.c -lpthread

-D_REENTRANT - 可重入,為了程式穩定性最好加

14-14.gif

其實makefile也有加這行

14-15.gif 

‧thread3a
thread在很多情況會有不同結果
而且很難debug
不過這個範例我忘了會有哪裡出錯了...

----
補充:台灣用的是通用拼音,大陸用漢語拼音
捷運站也是用漢語拼音

創作者介紹

正因為活著

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