寫在最前面:其實這是乙個上課作業,我覺得我不能就這麼簡單的實現了而不給後人留下點什麼糟粕。所以下面有興趣的同學就跟著我誤入歧途吧。我沒想按著apue這本書一章一章來,我認為既然是我自己讀完了這本書並要實現東西,就需要有我自己的節奏,這種節奏不僅僅讓我自己,也要讓各位看客感到輕鬆,並偶有所獲~我就十分開心了。
這學期報了一門課叫《unix環境高階程式設計》,本來打算水水過去的,沒想到老師需要我們每個人完成乙份大作業,作業內容就是艱深複雜的各種呼叫底層api實現的shell。
怎麼說呢?從嚴格意義上,作業系統可以定義為一種軟體,它控制計算機硬體資源,提供程式執行環境,我們將這種軟體成為核心(也就是kernel),核心的介面被稱為系統呼叫,公用函式庫構建在系統呼叫介面之上,應用程式既可以使用公用函式庫,也可以使用系統呼叫。shell是乙個特殊的應用程式,為執行其他程式提供了乙個介面。
我們要實現的shell就是這麼乙個東西。
廢話不多說,要開車了哦。
首先一台linux系統的計算機(比較方便,在windows下需要配置很多的環境,因為windows沒有unix的很多庫函式,我使用的是 ubuntu 16.04)
解壓原始碼檔案 tar -zxvf *.tar.gz
cd apue.3e/ & make
在這個過程中,你會看到最後由於can,t find-lbsd而不能make成功,解決辦法是新增libbsd.a的靜態鏈結庫
sudo apt-get install libbsd-dev
5. 重新 make 然後再
sudocp ./include/apue.h /usr/include/
sudocp ./lib/libapue.a /usr/local/lib/
有時候以上步驟完成後就可以隨便找書上的例子開始裝逼了,但是我的電腦不行,因為裡面有很多err_sys之類的報錯函式未定義,那麼還需要再執行一步。
複製下面的**,並儲存成 /usr/include/myerr.h
以後你寫的例子裡需要用到err_sys之類的函式,你需要 #include "myerr.h"
#include "apue.h"
#include /* for definition of errno */
#include /* iso c variable aruments */
static void err_doit(int, int, const char *, va_list);
/** nonfatal error related to a system call.
* print a message and return.
*/void
err_ret(const char *fmt, ...)
/** fatal error related to a system call.
* print a message and terminate.
*/void
err_sys(const char *fmt, ...)
/** fatal error unrelated to a system call.
* error code passed as explict parameter.
* print a message and terminate.
*/void
err_exit(int error, const char *fmt, ...)
/** fatal error related to a system call.
* print a message, dump core, and terminate.
*/void
err_dump(const char *fmt, ...)
/** nonfatal error unrelated to a system call.
* print a message and return.
*/void
err_msg(const char *fmt, ...)
/** fatal error unrelated to a system call.
* print a message and terminate.
*/void
err_quit(const char *fmt, ...)
/** print a message and return to caller.
* caller specifies "errnoflag".
*/static void
err_doit(int errnoflag, int error, const char *fmt, va_list ap)
既然是第一章,當然我們輕鬆點,那麼就來乙個最最開始的1-7程式吧,這個程式搭建了最基本的功能,也就是輸入,連命令也不是去解析調api而是直接用原始bash的命令~
//
// created by jasperyang on 17-6-6.
//#include "apue.h"
#include #include "myerr.h"
int main(void)
if((pid = fork()) < 0) else if (pid == 0)
/* parent */
if((pid = waitpid(pid,&status,0)) < 0)
err_sys("waitpid error");
printf("%% ");
}exit(0);
}
簡單易懂老少皆宜,這段程式輸入命令,並fork乙個child去執行命令,執行命令用的是execlp這個函式,執行失敗與否子程式都exit(127),127倒沒什麼特殊的含義。 課程筆記 優秀課程筆記整理
目錄 cs231n 李巨集毅老師機器學習課程 pytorch學習筆記 深度學習概述 神經網路基礎之邏輯回歸 神經網路基礎之python與向量化 淺層神經網路 深層神經網路 深度學習的實用層面 優化演算法 超引數除錯 batch正則化和程式設計框架 機器學習策略 上 機器學習策略 下 卷積神經網路基礎...
python課程筆記 Python課程筆記(二)
1 格式化輸出 print d d s 15,3.14,12.8 對比c語言 printf d,d,s 15,3.14,12.8 這裡可見 python要求更簡明一些。注意點 without syntaxwarning str object is not callable 在 的左側放置乙個字串 格...
課程筆記2
第六章 while語句 先判斷後迴圈 可能一遍都不執行 do while語句 先執行後判斷 至少執行一遍 賦初值 放在迴圈語句前,並挨著迴圈語句 while i 100 為死迴圈,不能結束 i i 2 i 2 i i 在迴圈體語句內定義的變數為區域性變數,在外不起作用。while cin x whi...