嗯...又過了一個禮拜沒發文的日子
雖然這並不是最久的一次(以前還有一個月只發文五篇的記錄)
但隔這麼久發文,還真是不自在~"~

這篇筆記是補上上禮拜的課程
這禮拜四上完,之後連放兩次假,接著就要開始期末考了
星期四的課真是吃虧...


‧pipe要fork process(複製一個程序)
需要的resource較多,一般不建議使用pipe open/close

‧老師常用的文字編輯軟體
1. PnotePad
2. SciTE - 特點是可以直接執行PHP程式,只要按下[Tools]-[Go]

我個人比較喜歡用PsPad啦,雖然真的會用到的時機不多
記事本就很好用了

uname -a - 顯示Linux版本資訊

‧任何時間寫入file_descriptor[1]的資料可以從file_descriptor[0]讀回來

‧pipe1
這是簡單的pipe範例
使用pipe記得要先引用#include <unistd.h>
順便一提,如果把file_pipes的0跟1互換,會寫入-1 bytes
但是不會顯示出錯誤

13_01.gif

‧pipe2
看起來結果一樣,但其實這個程式是由父process寫入,子process讀取
我稍微修改了範例,使用getpid()顯示process id即可看出差異

13_02.gif

‧pipe3
顯示出file_pipes可以看到
讀取資料是從fd 3,寫入資料則是fd 4(fd = file descriptor)
因為fd 0、1、2被用掉了,所以新的從3、4開始用
0、1、2是標準輸入、標準輸出、標準錯誤

13_03.gif

‧在程式裡執行其他程式的語法
execl(執行程式檔, 給他的名字, 傳過去的fd, Null pointer);
最後一個一定要給他null pointer喔

‧如果pipe在不同process必須分別處理他,很麻煩
dup - 電腦給你目前最小可以用的fd
dup2 - 我自己給你最小的fd

‧pipe5
Ln21: close(0);  關掉標準輸入
Ln22: dup(file_pipes[0]); - 給他目前最小的可以用的file descriptor
原本應該要從鍵盤去讀取的

‧輸入/dev;ll
發現權限的第一個字母是c,代表他是字元設備
其他代表 d:目錄、s:socket、p:pipe
(好像寫過很多次這個了)

13_04.gif

‧fifo1
產生pipe檔案,成功就回傳0
語法:mkfifo my_fifo(my_fifo是你想要取的檔名)

程式的執行方法:
先輸入cat < /tmp/my_fifo
他會將畫面停在那個地方
再到另一視窗輸入echo "Hello World" > /tmp/my_fifo
第一個視窗就會讀到字串了

13_05.gif

如果在程式後面加上&,代表他是在背景執行
範例:cat < /tmp/my_fifo &
背景代表它會在記憶體內自行運行,無法直接控制它
除非用bg/fg等指令把它叫出來

詳細說明可以參考鳥哥的Linux私房菜關於&的介紹

jobs - 顯示目前有什麼程式在背景執行
如果沒有的話會什麼都不顯示

13_06.gif

‧server & client
先輸入./server &讓他在背景執行
到另一個畫面輸入以下內容
for i in 1 2 3 4 5
do
./client &
done


它會自動執行五次,如下圖產生了5484~5488五個process
但是最後顯示出來的結果並不是照這個順序傳回來的
所以這個範例只是要告訴你...他不會照順序傳回來orz

13_07.gif

第二次作業雖然我在打這篇的時候已經截止一個禮拜了
但還是稍微說一下要怎麼做

1. 用gets之類的語法讓使用者輸入指令
2. 找出|(管線),並將token分成左右兩邊
3. 產生pipe,再用fork將這個process一分為二
4. 父親把標準輸出關掉,執行左邊程式並dup給兒子
5. 兒子把標準輸入關掉,執行右邊程式並接收父親的訊息

第一點應該也可以改用程式後面接參數的方式
比方說./hw2 w "|" wc這樣
但|為什麼要用雙引號""包起來呢?
因為如果不包的話,它會把|當成是真的管線而不是一個參數

arrow
arrow
    全站熱搜

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