系統程式設計 學習筆記 01

2021-09-13 00:10:19 字數 2515 閱讀 6137

是指編譯好的二進位制檔案,在磁碟上,不占用系統資源(cpu、記憶體、開啟的檔案、裝置、鎖…)

是乙個抽象的概念,與作業系統原理聯絡緊密。程序是活躍的程式,占用系統資源。在記憶體中執行。同乙個程式也可以載入為不同的程序(彼此之間互不影響)

環境變數,是指在作業系統中用來指定作業系統執行環境的一些引數。通常具備一下特徵。

儲存形式:與命令列引數類似。char *陣列,陣列名 environ, 內部儲存字串,null作為哨兵結尾。

使用形式:與命令列引數類似。

載入位置:與命令列引數類似。位於使用者區,高於 stack 的起始位置。

引入環境變數表:須宣告環境變數。extern char ** environ;

練習:列印當前程序的所有環境變數。

#include extern char **environ;

int main()

return 0;

}

shell

term

lang

home

獲取環境變數的值

練習:程式設計實現 getenv 函式

#include extern char **environ;

char *getenv(const char *name)

}if(environ[i][j] == '=')

}return null;

}int main()

else printf("-1\n");

return 0;

}

設定環境變數的值

刪除環境變數 name 的定義

練習:熟悉上述三個函式的使用

#include #include int main(void)

val = getenv("abc");

printf("env:%s,val:%s\n", "abc", val);

if(unsetenv("abc") == -1)

val = getenv("abc");

printf("env:%s,val:%s\n", "abc", val);

return 0;

}

建立乙個子程序

獲取當前程序的 pid

獲取當前程序的父程序 pid

練習:建立 5 代程序

#include #include #include #include int now;

void dfs()

else if(pid == 0)

}int main(void)

獲取當前程序實際使用者 id

獲取當前程序有效使用者 id

獲取當前程序實際使用者組 id

獲取當前程序有效使用者組 id

父子程序之間在 fork 後。有哪些相同,哪些異同之處呢?

剛 fork 之後:

父子程序間遵循讀時共享寫時複製的原則,目的節省記憶體開銷

【重點】父子程序共享:1.檔案描述符(開啟檔案的結構體),2.mmap建立的對映區(程序間通訊詳解)

特別的,fork之後父子程序誰先執行,取決於核心所使用的排程演算法。

當程序呼叫一種 exec 函式時,該程序的使用者空間**和資料完全被新程式替換,從新程式的啟動例程開始執行。呼叫 exec 並不建立新程序,所以呼叫 exec 前後該程序的 id 並未改變。

//set follow-fork-mode child

//set follow-fork-mode parent

**int execlp(const char file, const char arg, …) //系統可執行程式

**int execle(const char *path, const char arg, …, char const envp)

**int execv(const char path, char const ar**)

**int execvp(const char file, char const ar**)

**int execve(const char *path, char const ar**, char const envp);

練習:將當前系統中程序的資訊,列印到檔案中。

#include #include #include #include #include #include #include using namespace std;

int main(void)

dup2(fd, stdout_fileno);

execlp("ps", "ps", "aux", null);//呼叫錯誤 -1,沒有成功返回值

perror("exec error");

exit(1);

close(fd);

return 0;

}

exec 函式一旦呼叫成功即執行新的程式,不返回。只有失敗才返回,錯誤值 -1。

《Linux系統程式設計筆記》 DAY01

跳轉到檔案首 gg 命令模式 游標移至行首 游標移至行尾 自動格式化程式 大括號對應 跳轉至man手冊 將游標置於待檢視函式單詞上,用nk n是第幾卷 刪除乙個單詞 刪除游標至行尾 刪除游標至行首 刪除指定區域 按v 命令模式 切換為 可視模式 選中要刪除的區域,按d刪除 刪除指定一行 在游標所在行...

系統程式設計手冊學習筆記

1.庫函式 設計庫函式是為了提供比底層系統呼叫更為方便的呼叫介面 呼叫庫函式,有的不會執行任何系統呼叫 比如字串操作函式 有的則是構建於系統呼叫層之上的 比如fopen 是利用系統呼叫open 來執行開啟檔案的實際操作 c語言的函式庫有多個版本,gnu c是其中乙個版本,簡稱glibc,是linux...

linux系統程式設計學習筆記

關閉檔案 linux命令列引數解析 int creat const char filename,mode t mode mode指定新建檔案的訪問許可權 return 檔案描述符fd open const char pathname,o create,mode t mode 第二個引數flags為o...