CSAPP Shell Lab 實驗筆記

2021-10-24 12:48:05 字數 2653 閱讀 4066

在實驗中我們需要實現job、fg、bg、kill四個內建命令和對執行本地程式的支援,並且還要處理好sigchldsigintsigtstp這幾個訊號。關鍵要點都在課本的534頁有說過了:

驗收標準這一塊因為是在實際作業系統上跑的,不能保證程序號相同,但要保證處理程序號意外所有指令的順序和資訊都要與參考程式的輸出完全相同。這點可以用linux上的各種diff工具進行結果比較。

eval函式在課本p525頁有乙個缺陷版,我們要做的就是以此為藍本加上點訊號處理。

void

eval

(char

* cmdline)if(

!builtin_cmd

(ar**))}

// addjob涉及到全域性變數的操作,需要保證操作的原子性,故這裡阻塞掉所有訊號

sigprocmask

(sig_setmask,

&mask_all,

null);

addjob

(jobs, pid, bg?bg:fg, cmdline)

;sigprocmask

(sig_setmask,

&prev_mask,

null);

sigprocmask

(sig_block,

&mask_chld,

null);

if(!bg)

else

// 操作結束後解除阻塞

sigprocmask

(sig_setmask,

&prev_mask,

null);

}return

;}

waitfg負責等待前台程序結束。每次都呼叫fgpid有點低效了,我們直接用乙個全域性標誌fg_child_flag代表前台程序是否異常,預設為0,如果切換到停止或退出狀態就置1。

void

waitfg

(pid_t pid)

return

;}

要注意子程序終止或停止都可能觸發sigchld,所以我們得分類討論。

void

sigchld_handler

(int sig)if(

wifexited

(status)

)elseif(

wifsignaled

(status)

)elseif(

wifstopped

(status)

)sigprocmask

(sig_setmask,

&prev_mask,

null);

} errno=olderrno;

return

;}

因為程序在終止時會自動向父程序傳送sigchld訊號,所以部分邏輯放在了sigchld_handler,這裡只要對子程序發出sigint訊號就行

void

sigint_handler

(int sig)

return

;}

設計思路同上

void

sigtstp_handler

(int sig)

return

;}

仍舊參考課本525頁,挨個命令strcmp就行

int

builtin_cmd

(char

** ar**)if(

!strcmp

(ar**[0]

,"fg")||

!strcmp

(ar**[0]

,"bg"))

if(!strcmp

(ar**[0]

,"jobs"))

if(!strcmp

(ar**[0]

,"kill"))

if(!strcmp

(ar**[0]

,"&"))

return0;

/* not a builtin command */

}

這個也沒啥難度,對著參考輸出慢慢地新增判斷細節就行

void

do_bgfg

(char

** ar**)

else

if(ar**[1]

[0]==

'%')

pid = job->pid;

}else

job =

getjobpid

(jobs, pid);if

(job ==

null)}

if(!strcmp

(ar**[0]

,"bg"))

elseif(

!strcmp

(ar**[0]

,"fg"))

elseif(

!strcmp

(ar**[0]

,"kill"))

return

;}

實驗 GDB實驗

1 理解gdb工具原理 2 使用gdb工具進行除錯程式 3 gdb遠端除錯 1 在 embedded目錄下建立目錄,目錄名 testgdb 2 建立檔案greeting.c 如下 include int main void my print char string void my print2 ch...

實驗 入門實驗

通過乙個最簡單,最基本的嵌入式應用程式,熟悉基本的嵌入式應用程式開發環境和工具,理解基本的嵌入式程式設計方法和流程。1 開發環境 絕大多數的linux 軟體開發都是以native 方式進行的,即本機 host 開發 除錯,本機執行的方式。這種方式通常不適合於嵌入式系統的軟體開發,因為對於嵌入式系統的...

實驗 C 實驗2 1

一 問題及 檔名稱 bog 作 者 魏港亮 完成日期 2016 年 3 月 24日 版 本 號 v1.0 對任務及求解方法的描述部分 輸入描述 輸入一位成年男性的體重和身高 問題描述 標準體重 程式輸出 這位成年人的體重與標準體重的比較 問題分析 略 演算法設計 if 語句 三 心得體會 第二次程式...