版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、高级编程笔试题答案一、 选择题1. 在网络字节序中,所谓”小端”(little endian)说法正确的是( B )A. 高字节数据存放在低地址处,低字节数据存放在高地址处 B. 低字节位数据存放在内存低地址处, 高字节位数据存放在内存高地址处C. 和编译器相关 D. 上述答案都不正确2. C语言中,系统自动打开的文件是( D )A.二进制文件B.随机文件C.非缓冲文件D.设备文件3. TCP使用( B )进行流量控制。A. 3次握手法B. 窗口控制机制C. 自动重发机制D. 端口机制4. TCP/IP层IP协议的服务是( C )A. 可靠服务B. 有确认的服务 C. 无连接数据报D. 以上都
2、不对5. 对于一个没有设置任何套接口选项的阻塞套接口,调用recv接收对方的数据,对方发送数据前突然断电,下列哪种情况将会发生( A )A. recv永远不会返回B. recv立刻返回-1C. recv立刻返回0D. recv在等待很长一段时间后返回-16. 下列哪些关于套接口选项函数的说法是正确的( C )A. SO_DONTLINGER选项是让TCP套接口不对数据进行缓存,调用send函数后立刻将数据发送出去;B.调用SO_RCVBUF和SO_SNDBUF调整TCP窗口的大小;C. SO_REUSEADDR选项允许套接口绑定在一个已经在使用的地址上;D. SO_MAX_MSG_SIZE选项
3、获取每次调用TCP套接口send时,所能发送的最大字节数;二、 问答题1. fork和vfork的区别?vfork用于创建一个新进程,而该进程的目的是exec一个新程序。vfork与fork一样都创建一个子进程,但他并不把父进程地址空间完全复制到子进程中,因为子进程通常都会调用exec或(_exit),于是也就不会访问该地址空间。vfork与fork的另一个区别是vfork保证子进程先运行,在它调用exec或_exit之后父进程才可能被调度运行。vfork使用如下例:#include #include #include #include int globvar=6;/*external var
4、iable in initialized data */intmain(void)int var; /* automatic variable on the stack */pid_t pid;var = 88;printf(before vforkn); /* we dont flush stdio */if (pid = vfork() 0),其中的a应该定义为有符号类型还是无符号类型?无符号类型39. 怎么让父进程知道子进程结束了?waitwaitpid40. 说说使用管道和共享内存的整个过程?管道:a) 创建管道b) 读写共享内存:a) 获取keyb) 获取共享内存c) 映射到虚拟地址
5、空间d) 读写访问e) 解映射f) 删除共享内存41. 进程关闭了,管道或者共享内存还存在吗,为什么?管道 不存在共享内存 存在42. 僵尸进程是什么?怎么形成的,哪些情况下会形成僵尸进程?参考博客:基本概念孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。问题及危害unix提供了一种机制
6、可以保证只要父进程想知道子进程结束时的状态信息, 就可以得到。这种机制就是: 在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等。 但是仍然为其保留一定的信息(包括进程号the process ID,退出状态the termination status of the process,运行时间the amount of CPU time taken by the process等)。直到父进程通过wait / waitpid来取时才释放。 但这样就导致了问题,如果进程不调用wait / waitpid的话, 那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统
7、所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程. 此即为僵尸进程的危害,应当避免。孤儿进程是没有父进程的进程,孤儿进程这个重任就落到了init进程身上,init 进程就好像是一个民政局,专门负责处理孤儿进程的善后工作。每当出现一个孤儿进程的时候,内核就把孤 儿进程的父进程设置为init,而init进程会循环地wait()它的已经退出的子进程。这样,当一个孤儿进程凄凉地结束了其生命周期的时候,init 进程就会代表党和政府出面处理它的一切善后工作。因此孤儿进程并不会有什么危害。任何一个子进程(init除外)在exit()之后,并非马上就消失掉,
8、而是留下一个称为僵尸进程(Zombie)的数据结构,等待父进程处理。这 是每个 子进程在结束时都要经过的阶段。如果子进程在exit()之后,父进程没有来得及处理,这时用ps命令就能看到子进程的状态是“Z”。如果父进程能及时 处理,可能用ps命令就来不及看到子进程的僵尸状态,但这并不等于子进程不经过僵尸状态。 如果父进程在子进程结束之前退出,则子进程将由init接管。init将会以父进程的身份对僵尸状态的子进程进行处理。僵尸进程危害场景:例如有个进程,它定期的产 生一个子进程,这个子进程需要做的事情很少,做完它该做的事情之后就退出了,因此这个子进程的生命周期很短,但是,父进程只管生成新的子进程,
9、至于子进程 退出之后的事情,则一概不闻不问,这样,系统运行上一段时间之后,系统中就会存在很多的僵死进程,倘若用ps命令查看的话,就会看到很多状态为Z的进程。 严格地来说,僵死进程并不是问题的根源,罪魁祸首是产生出大量僵死进程的那个父进程。因此,当我们寻求如何消灭系统中大量的僵死进程时,答案就是把产生大 量僵死进程的那个元凶枪毙掉(也就是通过kill发送SIGTERM或者SIGKILL信号啦)。枪毙了元凶进程之后,它产生的僵死进程就变成了孤儿进 程,这些孤儿进程会被init进程接管,init进程会wait()这些孤儿进程,释放它们占用的系统进程表中的资源,这样,这些已经僵死的孤儿进程 就能瞑目而
10、去了。代码孤儿进程和僵尸进程测试#include #include #include #include int main() pid_t pid; /创建一个进程 pid = fork(); /创建失败 if (pid 0) perror(fork error:); exit(1); /子进程 if (pid = 0) printf(I am the child process.n); /输出进程ID和父进程ID printf(pid: %dtppid:%dn,getpid(),getppid(); printf(I will sleep five seconds.n); /睡眠5s,保证父进
11、程先退出 sleep(5); printf(pid: %dtppid:%dn,getpid(),getppid(); printf(child process is exited.n); /父进程 else printf(I am father process.n); /父进程睡眠1s,保证子进程输出进程id sleep(1); printf(father process is exited.n); return 0;僵尸进程测试#include #include #include #include int main() pid_t pid; pid = fork(); if (pid 0)
12、perror(fork error:); exit(1); else if (pid = 0) printf(I am child process.I am exiting.n); exit(0); printf(I am father process.I will sleep two secondsn); /等待子进程先退出 sleep(2); /输出进程信息 system(ps -o pid,ppid,state,tty,command); printf(father process is exiting.n); return 0;多个僵尸进程#include #include #incl
13、ude #include int main() pid_t pid; /循环创建子进程 while(1) pid = fork(); if (pid 0) perror(fork error:); exit(1); else if (pid = 0) printf(I am a child process.nI am exiting.n); /子进程退出,成为僵尸进程 exit(0); else /父进程休眠20s继续创建子进程 sleep(20); continue; return 0;43. 僵尸进程解决办法?(1)通过信号机制子进程退出时向父进程发送SIGCHILD信号,父进程处理SIG
14、CHILD信号。在信号处理函数中调用wait进行处理僵尸进程。测试程序如下所示:#include #include #include #include #include static void sig_child(int signo);int main() pid_t pid; /创建捕捉子进程退出信号 signal(SIGCHLD,sig_child); pid = fork(); if (pid 0) printf(child %d terminated.n, pid);(2)fork两次Unix 环境高级编程8.6节说的非常详细。原理是将子进程成为孤儿进程,从而使的父进程变为init进程,通过init进程可以处理僵尸进程。测试程序如下所示:#include #include #include #include int main() pi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度违约借款合同案例分析3篇
- 2025年度消防工程消防喷淋系统安装与承揽施工合同3篇
- 教室用电安全检查与整改措施报告
- 2025年度湿地公园水面渔业资源保护合作协议3篇
- 师徒关系的深度分析培养高素质研究生路径探索
- 教育技术视角下的学生心理疏导路径
- 展会销售的团队协作与冲突解决技巧
- 教育领域内小吃摊点的经营策略与食品选择
- 教育领域的新星小学德育的科技与创新实践
- 第五单元 活动二《设置赛道与对手》说课稿 2023-2024学年沪科版(2023)初中信息技术九年级下册
- 2023年中考语文备考之名著阅读《经典常谈》思维导图合集
- 2023年湘教版数学七年级下册《整式的乘法》单元质量检测(含答案)
- 气柜安装工程施工方案
- GB/T 28750-2012节能量测量和验证技术通则
- GB/T 18791-2002电子和电气陶瓷性能试验方法
- 分子生物学本基因组及基因组学概论
- 《人工智能》全册配套课件
- 统编部编版四年级道德与法治下册优秀课件【全册】
- 高职大专《体育与健康》课程标准
- 12月1日世界艾滋病日预防艾滋病讲座PPT珍爱生命预防艾滋病PPT课件(带内容)
- 测量仪器自检记录表(全站仪)
评论
0/150
提交评论