2018-2019-1 20165220 《信息安全系統設計基礎》第八周學習總結
教材知識點總結
1.並發程序有三種方法
a.線程:線程是運行在單一進程上下文中的邏輯流,由內核進行調度
b.進程:每個邏輯流都是一個進程,由內核來調度和維護。
c..I/O多路復用:在這種形式中,應用程序在一個進程的上下文中顯式地調度它們自己的邏輯流。邏輯流被模型化為狀態機。因為程序是一個單獨的進程,所以所有的流都共享同一個地址空間。
2.構造並發服務器的自然方法就是,在父進程中接受客戶端連接請求,然後創建一個新的子進程來為每個新客戶端提供服務。
3.因為父子進程中的已連接描述符都指向同一個文件表表項,所以父進程關閉它的已連接描述符的拷貝是至關重要的,而且由此引起的存儲器泄露將最終消耗盡可用的存儲器,使系統崩潰。
4.客戶端-服務器編程模型
a.一個應用是由一個服務器進程和一個或多個客戶端進程組成
b.服務器進程 -> 管理某種資源 -> 通過操作這種資源來為它的客戶端提供某種服務
5.全球IP因特網
a.TCP/IP協議族
b.因特網的客戶端和服務器混合使用套接字接口函數和UnixI/O函數進行通信
6.
每個網絡應用都是基於客戶端一服務器模型的。一個應用是由一個服務器進程和一個或者多個客戶端進程組成。服務器管理某種資源,並且通過操作這種資源來為它的客戶端提供某種服務。
客戶端一服務器模型中的基本操作是事務,一個客戶端-服務器由四步組成:
a.當一個客戶端需要服務時,它向服務器發送一個請求,發起一個事務。
b.服務器收到請求後,解釋它,並以適當的方式操作它的資源。
c.服務器給客戶端發送一個響應,並等待下一個請求。
d.客戶端收到響應並處理它。
7.
socket 函數
客戶端和服務器使用 socket 函數來創建一個套接字描述符
connect 函數
客戶端通過調用 connect 函數來建立和服務器的連接。
open_clientfd 函數
open_clientfd 函數和運行在主機 hostname 上的服務器建立一個連接,並在知名端口 port 上監聽連接請求。它返回一個打開的套接宇描述符,該描述符準備好了,可以用 Unix I/O 函數做輸入和輸出。
** bind 函數**
bind、 listen 和 accept 被服務器用來和客戶端建立連接。
加分項目——pwd的實現
首先通過man 命令了解了一下pwd的用法
相關代碼
#include<stdio.h> #include<sys/stat.h> #include<dirent.h> #include<stdlib.h> #include<string.h> #include<sys/types.h> void printpath(); char *inode_to_name(int); int getinode(char *); int main() { printpath(); putchar(‘\n‘); return ; } void printpath() { int inode,up_inode; char *str; inode = getinode("."); up_inode = getinode(".."); chdir(".."); str = inode_to_name(inode); if(inode == up_inode) { // printf("/%s",str); return; } printpath(); printf("/%s",str); } int getinode(char *str) { struct stat st; if(stat(str,&st) == -1){ perror(str); exit(-1); } return st.st_ino; } char *inode_to_name(int inode) { char *str; DIR *dirp; struct dirent *dirt; if((dirp = opendir(".")) == NULL){ perror("."); exit(-1); } while((dirt = readdir(dirp)) != NULL) { if(dirt->d_ino == inode){ str = (char *)malloc(strlen(dirt->d_name)*sizeof(char)); strcpy(str,dirt->d_name); return str; } } perror("."); exit(-1); }
運行結果:
總結:pwd命令的作用是查看當前所在的工作路徑。
2018-2019-1 20165220 《信息安全系統設計基礎》第八周學習總結