一、 选择题(10题,每题2分,共20分)
1. 如果进程A调用fork函数,创建进程B,然后进程B再调用fork函数,创建进程C,进程C调用
exec执行新的程序,那么各个进程将以什么顺序来执行:( D )。
[A] 以A、B、C的顺序执行 [B] 以C、B、A的顺序执行 [C] 以B、C、A的顺序执行 [D] 无固定执行顺序
2. 以下对早期ARPAnet的描述不正确的是 ( D ) [A] 使用NCP协议 [B] 不能互联不同类型的计算机 [C] 没有纠错功能 [D] 可以互联不同类型的操作系统
3. Internet中的世界语是 ( C )
[A] TCP [B] IP [C] TCP/IP [D] http
4. 以下不属于socket的类型的是 ( D )。 [A] 流式套接字 [B] 数据报套接字 [C] 原始套接字 [D] 网络套接字
5. 以下关于socket的描述错误的是 ( C ) [A] 是一种文件描述符 [B] 是一个编程接口 [C] 仅限于TCP/IP
[D] 可用于一台主机内部不同进程间的通信
6. 路由器是根据哪一层的信息为数据包选择路由 ( C )
[A] 物理层 [B] 数据链路层 [C] 网络层 [D] 传输层
7. 为了解决在不同体系结构的主机之间进行数据传递可能会造成歧义的问题,以下( A )函数常常用来
在发送端和接收端对双字节或者四字节数据类型进行字节序转换。 [A] htons()/htonl()/ntohs()/ntohl() [B] inet_addr()/inet_aton()/inet_... [C] gethostbyname()/gethostbyaddr()
[D] (struct sockaddr *)&(struct sockaddr_in类型参数)
8. 在实现基于TCP的网络应用程序时,服务器端正确的处理流程是( C ) [A] socket() -> bind() -> listen() -> connect() -> read()/write() -> close() [B] socket() -> bind() -> listen() -> read()/write() -> close()
[C] socket() -> bind() -> listen() -> accept() -> read()/write() -> close() [D] socket() -> connect() -> read()/write() -> close()
9. 只用于同一主机内部进程间通信的socket应使用的协议族是 ( B )
[A] AF_INET [B] AF_UNIX [C] AF_NS [D] AF_IMPLINK
10. 以下哪个协议不是用在网络层的 ( D )
[A] IGMP [B] IP [C] ICMP [D] SMTP
二、 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
判断题(15题,每题1分)
信号是一种同步通讯方式 ( F )
可以使用signal()来给同一进程组中的所有进程发送信号 ( F )
从一个空FIFO中读取数据时会发生阻塞,但从一个空PIPE中读取数据时不会发生阻塞 ( F ) IP地址均为32位 ( F )
大端序表示高位字节存储在高地址 ( F )
bind()函数用于将套接字和某个地址绑定 ( T )
connect()函数既可以用于TCP,也可以用于UDP ( T ) 每个套接字最多只能connect一次 ( F )
为了区分一台主机接收到的网络数据包应该递交给哪个套接字来处理,要根据端口号 ( T )
无论是TCP socket,还是UDP socket,它们的服务器端必须调用bind()函数来绑定一个地址,这样客户端才可以和服务器端通信 ( T )
11. 发送一个UDP数据报,必须使用sendto()函数 ( F )
12. 当inet_addr(char *address)的参数address包含不合法的IP地址时,函数返回0 ( F ) 阅读以下程序,完成13-15题。
┋
listenfd = socket(…); bind(listenfd,…);
listen(listenfd,…); for ( ; ; ) {
connfd = accept(listenfd, …); if (( pid = fork( )) == 0)
{
}
else exit(0); }
13. 这是一个并发服务器。( F )
14. 在任何时候,该服务器只能处理一个客户端的请求。( T )
15. 随着服务器端接受越来越多的请求,connfd的值变得越来越大。( T )
三、简答题(5题,每题5分,共25分)
1. 如何在并发程序中避免僵尸进程?(父进程不阻塞,不轮询,描述思路或写出代码)
方式一:在父进程中忽略SIGCHLD信号
方式二:在父进程中捕捉SIGCHLD信号,并在信号处理函数中用waitpid回收子进程
2. 两个线程分别读写同一个缓冲区,初始时缓冲区中无数据。
( read() //读缓冲区 write() //写缓冲区 sem_t //信号量类型 void init_sem(sem_t *s, int value) // 初始化信号量s的值为value void p(sem_t *s) // 对信号量s进行p操作 void v(sem_t *s) // 对信号量s进行v操作)
① 定义需要的信号量并初始化
sem_t s_r, s_w; init_sem(&s_r, 0); init_sem(&s_w, 1);
②写线程写缓冲区的代码
p(&sem_w); write(); v(&sem_r);
recv(connfd,…); send(connfd,…);
③读线程读缓冲区的代码 p(&sem_r); read();
v(&sem_w);
3. 简述TCP和 UDP的异同点
相同点:都是传输层协议
不同点:tcp协议面向连接,提供可靠的传输;udp协议无连接,不保证可靠的传输
4. 什么是高可靠性通信?
数据无错误、数据无丢失、数据无失序、数据无重复到达
5. 简述UNIX/Linux下主要的四种IO模型的特点
阻塞式IO :最简单、最常用;效率低
非阻塞式IO :可以处理多路IO;需要轮询,浪费CPU资源 IO多路复用 :同时出路多路IO且不需要轮询
信号驱动IO :异步通知模式,需要底层驱动的支持
四、综合题(3题,共40分,编程题可省略头文件)
1. 什么是网络体系结构? 画出OSI和TCP/IP参考模型的对应关系图(包括每层常用的协议或应
2. 编写一个TCP并发服务器端程序,可以把客户端发来的消息回射给客户端 (15分)
3. 编写UDP程序,通过多路IO复用同时处理标准输入和套接字。当输入为quit时程序结束;当通
过套接字收到对方消息时回射给对方 (15分)
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeval); void FD_CLR(int fd, fd_set *set); int FD_ISSET(int fd, fd_set *set); void FD_SET(int fd, fd_set *set); void FD_ZERO(fd_set *set);
因篇幅问题不能全部显示,请点此查看更多更全内容