首先是eval函式:
void
eval
(char
*cmdline)}if
(!bg)
addjob
(jobs, pid, fg, cmdline)
;else
addjob
(jobs, pid, bg, cmdline)
;sigprocmask
(sig_unblock,
&mask,
null);
//如果不阻塞sigchld訊號,可能會發生先deletejob再addjobif(
!bg)
waitfg
(pid)
;else
printf
("[%d] (%d) %s\n"
,pid2jid
(pid)
, pid, cmdline);}
return
;}
可以參考書本p525 eval函式,但不同的是這裡加了乙個addjob的操作,所以需要阻塞訊號,因為如果不阻塞,可能發生系統先排程子程序執行,子程序執行完後傳送訊號給父程序,父程序收到訊號先deletejob再addjob,這樣就會出錯。
然後是builtin_cmd函式,這個函式內容比較簡單,主要是呼叫do_bgfg函式:
int
builtin_cmd
(char
**ar**)if(
!strcmp
(ar**[0]
,"bg")||
!strcmp
(ar**[0]
,"fg"))
return0;
}
然後是do_bgfg函式:
void
do_bgfg
(char
**ar**)if(
!strcmp
(ar**[0]
,"bg"))
if(!strcmp
(ar**[0]
,"fg"))
return
;}
這裡作業要求有點亂,只能根據書本p555要求一條一條來,首先拆分命令,第乙個是bg或者fg,第二個是jid或者pid,首先統一把前面的全部換成jid,尋找任務返回指標,根據fg判斷是前台執行還是後台執行。
waitfg很簡單,就是等待前台任務執行完:
void
waitfg
(pid_t pid)
然後是sigchld訊號的處理,即當乙個子程序停止或終止時需要使用的handler函式:
void
sigchld_handler
(int sig)
else
deletejob
(jobs, pid);}
return
;}
wuntraced | wnohang 在書本p517,子程序有乙個停止或者終止,返回他的pid,有三種可能,一種是ctrl-z,一種是ctrl-c,一種是完成後返回,那麼分別處理,前兩種主要是處理函式在做,最後一種直接刪除任務即可。
針對前兩種,有兩個處理函式,首先是sigint_handler:
void
sigint_handler
(int sig)
return
;}
按下ctrl-c就是要前台任務結束執行,那麼只要deletejob,另外還要將訊號**給程序組中所有程序,所以要寫一句kill(-pid, sig),-pid就是程序組中所有程序,因為他可能在執行過程中有子程序,要一起殺死。
然後是sigtstp_handler函式:
void
sigtstp_handler
(int sig)
return
;}
是類似的,只不過不能deletejob,而是把狀態改為st。
這麼做下來,test到08的時候就出現了問題,問題大致是前台的還沒有結束就有新的命令輸入進來這樣的問題,另外有時候jobs指令也會出錯,因此我參考了部落格:
前三個函式不做改動與部落格中的大致相同,不做改動。
後面函式改動如下:
void
waitfg
(pid_t pid)if(
wifstopped
(status))if
(!wifstopped
(status))}
void
sigchld_handler
(int sig)
return;}
void
sigint_handler
(int sig)
return;}
void
sigtstp_handler
(int sig)
return
;}
sigtstp_handler和sigint_handler裡面的內容變少了,這符合handler函式要盡量短小的要求,原先的函式中有printf,delete這樣的函式存在,有風險!這些操作全都應該交給waitfg做,他不是乙個handler函式,所以安全。另外,由於在子程序終止時候deletejob工作必須交給sigchld_handler做,所以這裡deletejob使用了阻塞訊號保證他在執行過程中不會受到干擾。
這樣所有的make test 都和make rtest 一樣了。
malloclab的一些思路
首先是參考書上第598 602頁 但是照搬書上的 只有六十多分 預設的也有七十多 注意到書上p594頁說,下一次適配很可能比首次適配記憶體利用率高,尤其是當鍊錶前面布滿了許多小碎片的時候,但在有些情況下,下一次適配不及首次適配,書上的 採用的是首次適配,因此嘗試下一次適配。兩者最大的差別就在於fin...
一些設計思路
智慧型裝置 1.s2c 介面,在 裡新增 system cmd 然後就可以進行伺服器遠端除錯啦。這樣做可以縮短終端裝置開發時間 智慧型裝置往往要求是終端提供穩定可靠的介面給伺服器統一呼叫,因為終端公升級太麻煩啦 2.同樣的需要,終端功能夠強壯,伺服器進行控制。尤其是前期,強制公升級很需要 3.昨天討...
C 的一些基本的思路
本博文為侯捷老師c 物件導向高階開發的課程筆記 一種基本的概念是我們學習c 不止要學習他們的語言,還要學習c 的標準庫 c和c 的不同 c語言在這設計程式的時候會準備一些資料和函式,根據資料的型別建立除一些變數,函式來處理這些變數,由於語言沒有提供足夠的關鍵字,所以這些資料一定是全域性的,這樣對程式...