遨遊Unix APUE課程筆記

2021-09-16 20:05:40 字數 2884 閱讀 5937

寫在最前面:其實這是乙個上課作業,我覺得我不能就這麼簡單的實現了而不給後人留下點什麼糟粕。所以下面有興趣的同學就跟著我誤入歧途吧。我沒想按著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...