首先我們先看一下shell的執行過程:
shell從使用者讀入字串"ls",並建立乙個新的程序,在那個程序中執行ls程式並等待那個程序結束。然後shell讀取新的一行輸入,建立乙個新的程序,在這個程序中執行程式並等待這個程序結束。
所以我們要寫乙個微型shell,需要迴圈以下過程:
獲取終端輸入。
解析輸入(按空格解析到乙個乙個的命令引數)。
建立乙個子程序,在子程序中進行程式替換,讓子程序執行命令。
等待子程序執行完畢,收屍,獲取退出狀態碼。
根據這個思路和我們之前學習到的知識,就可以自己實現乙個微型shell了。
來看**(使用linux作業系統實現):
#include#include#include#include#includeint argc;
char *argv[32];
int param_parse(char *buff)
ptr++;
} argv[argc++] = tmp;
argv[argc] = null;
return 0;
}int exec_cmd()
//父程序在這裡必須等待子程序退出,來看看子程序為什麼退出了,是不是出現了什麼錯誤。
//通過獲取狀態碼,並且轉換一下退出碼所對應的錯誤資訊進行列印。
int statu;
wait(&statu);
//判斷子程序是否**執行完畢退出
if (wifexited(statu))
return 0;
}int main()
; // %[^\n] 獲取資料直到遇到\n為止
// %*c 清空緩衝區,資料都不要了
scanf("%[^\n]%*c", buff);
printf("%s\n", buff);
param_parse(buff);
exec_cmd;
} return 0;
}
測試結果:
linux程式設計 模擬實現乙個執行緒池
實現乙個執行緒池需要構建三個類 執行緒任務類給定兩個介面,settask 負責把給的資料和方法傳進任務系統,start 負責將給定資料用給定方法來處理。安全佇列類,負責給執行緒池提供乙個能夠互斥訪問的安全佇列。執行緒池類提供三個介面,threadpool 建立指定數量的執行緒,taskpush 將任...
如何模擬實現乙個call apply bind函式
call模擬實現 首先我們實現繫結this功能。比如我們有乙個foo函式 function getname 還有乙個wechat物件 const wechat 我們希望實現 getname.call wechat fedaily以wechat和getname這個為例,這裡的this即getname,...
模擬實現Linux下命令 ls
首先我們對linux下ls命令已經非常熟悉了,我在這裡用c語言僅實現ls l及ls l 僅作練習使用 首先需要了解ls l命令都做了那些活動,那麼就需要研究以下 我們可以看到有七列主要內容,先來逐個分析 檔案的型別,此圖里所有檔案均為目錄,所以是d。許可權 本使用者許可權 本組使用者許可權 其他使用...