shelllab的一些思路

2021-10-18 09:09:50 字數 2764 閱讀 4714

首先是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語言在這設計程式的時候會準備一些資料和函式,根據資料的型別建立除一些變數,函式來處理這些變數,由於語言沒有提供足夠的關鍵字,所以這些資料一定是全域性的,這樣對程式...