教材知识点总结
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(' '); 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命令的作用是查看当前所在的工作路径。