UNIX期末考试试题答案_第1页
UNIX期末考试试题答案_第2页
UNIX期末考试试题答案_第3页
UNIX期末考试试题答案_第4页
UNIX期末考试试题答案_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1简述C程序的内存空间布局。1)指出代码、数据、堆和栈几个局部,2)并能指出每个局部的作用。答:高地址)命令行参数和J环境变量低地址未初始化的数据初始化的数据正文高地址)命令行参数和J环境变量低地址未初始化的数据初始化的数据正文由exec初J始化为0由exec从程序,文件中读入栈:由编译器自动分配释放管理。局部变量及每次函数调用时返回地址、以及调用者 的环境 信息(例如某些机器寄存器)都存放在栈中。新被调用的函数在栈上为其自动和临时变量 分配存储空间。通过以这种方式使用栈,C函数可以递归调用。递归函数每次调用自身 时,就使用一个新的栈帧,因此一个函数调用实例中的变量集不会影响另一个函数调用实

2、例中的变量。局部变量b.函数调用时返回地址c,调用者的环境信息(例如某些机器寄存器)堆:需要由程序员分配释放管理,假设程序员不释放,程序结束时可能由OS回收。通常在堆中 进行动态存储分配。如程序中的malloc,calloc, realloc等函数都从这里面分配。堆是从 下向上分配的。非初始化数据段:通常将此段称为bss段,这一名称来源于早期汇编程序的一个操作符,意思是block started by symbol (由符号开始的块),未初始化的全局变量和静态变量存放在这里。在程序开始执行之前,内核将此段初始化为0。函数外的说明:long sum1000;使此变 量存放在非初始化数据段中。a.

3、未初始化的全局变量b,未初始化的静态变量初始化的数据:通常将此段称为数据段,它包含了程序中需赋初值的变量。初始化的全局变量和静态变量 存放在这里。例如,C程序中任何函数之外的说明:int maxcount = 99;使此变量以初值 存放在初始化数据段中。a ,初始化的全局变量b ,初始化的静态变量正文段:CPU执行的机器指令局部。通常,正文段是可共享的,所以即使是经常环境指针环境表 环境字符串执行的程序(如文本编辑程序、C编译程序、she II等)在存储器中也只需有 一个副本,另外,正文段常常是只读的,以防止程序由于意外事故而修改其自身的指令。 2简述文件权限中的s位(setuid位)的作用。

4、答:保存的设置用户ID (setuid)和保存的设置组ID (setgid)在执行一个程序时包含了有 效用户ID和有效组ID的副本。如果设置了设置用户ID位,那么进程在执行该程序时就具有该程序所有者的权限(进程 的有效用户ID设置为程序所有者用户ID),如果设置了设置组ID位,那么进程在执行该程序 时就具有该程序的组所有组的权限(进程的有效组ID设置为程序组所有者ID)。设置用户 ID位和设置组ID位都包含在st_mode值中。3请写一段shell程序,完成以下功能:将a.txt, b.txt, c.txt三个文本文件合并,并剔除其中的 重复行,将结果输出到d.txt文件中。1)用cat读出3

5、个文件,2)用sort将这些进行排序,3)剔除其中的空行。答:cat a.txt,b.txt,c.txtd.txtsort -u d.txtsed -i 7A*$/d5 d.txt4. Apache web服务器能够实现个人主页的功能(即让apache进程能访问每个用户的主目录 下的publichtml目录)假设Apache进程以apache用户的身份执行,每个用户的主目录的所有 者都为各自用户。请问,怎样设置每个用户的主目录和public_html目录的读写权限,才能让 Apache进程能顺利读取,同时也保证各个用户的主目录不能被其他用户访问? 1)如何设定目录的所有组,2)如何设定目录的权

6、限,3)解释原因。答:文件和目录的权限表示,是用rwx这三个字符来代表所有者、用户组和其他用户的权限。有时候,字符似乎过于麻烦,因此还有另外一种方法是以数字来表示权限,而且仅需三个数 字。r:对应数值4, w:对应数值2, x:对应数值1,-:对应数值0。加入想一次修改某个目录下所有文件的权限,包括子目录中的文件权限也要修改,要使用 参数一R表示启动递归处理。rootlocalhost -J# ch mod 660 /home/user 注:仅把/home/iiser 目录的权限设置为 rwxrwxrwx rootlocalhost # chmod -R 660 /home/public_ht

7、ml 注:表示将整个/home/user 目录与其中的 文件和子目录的权限都设置为rwxrwxrwxo文件与目录不仅可以改变权限,其所有权及所属用户组也能修改,和设置权限类似,用户 可以通过图形界面来设置,或执行chown命令来修改。要改变所属组,可使用下面命令:rootlocalhost # chown :users /home/public_htmlorootlocalhost # chown :users /home/users o5在编写守护进程是,常使用两次调用fork系统调用的方法来产生子进程,因 为这样能防止产生僵死进程。请写出相应的程序代码,并解释其原因。答:#include#

8、include#include I#include#includeI7void daemonize(const char *cmd)intpid_t pid;structrlimitrl;structsigaction sa;14.14.I1516.1722I23-3637.38I3914.I14.I1516.1722I23-3637.38I39/get maximum number of file descriptors if(getrlimit(RLIMIT_NOFILE,&rl) 0) perror(getlimit);return;)/become a session leader t

9、o lose controlling TTYif(pid = fork() 0) exit(0);)setsid();/ensure future opens wont allocate controlling TTYs sa.sa_handler = SIG_IGN;sigemptyset(&sa.sa_mask);sa.sa_flags = 0;if(sigaction(SIGHUP, &sa, NULL) 0) perror(sigaction);return;if(pid = fork。) 0)exit(0);)/change the current working dir to th

10、e rootif(chdir(7) 0)perror(chdir);return;)/close all open file descriptorsif(rl.rlim_max = RLIM_INFINITY)rl.rlim_max = 1024;for(i=0; i unexpected file descriptors %d %d %cT,fdl, fd2);exit(l);int main(void)daemonize(dtest);while(l)sleep(l);)6有哪些方法可以让一个进程在会话退出后仍能在后台可靠运行?请写出两种方法,并解释原理。hohup 2) setsid 3

11、) screen 4)解释原因。答:在Linux/Unix中,有这样几个概念:进程组(process group): 一个或多个进程的集合,每一个进程组有唯一一个进程组 ID,即进程组长进程的ID。会话期(session): 一个或多个进程组的集合,有唯一一个会话期首进程(session leader)o会话期ID为首进程的ID。会话期可以有一个单独的控制终端(controlling terminal)o与控制终端连接的会话期 首进程叫做控制进程(controllingprocess)。当前与终端交互的进程称为前台进程组。其余 进程组称为后台进程组。挂断信号(SIGHUP)默认的动作是终止程序

12、。当终端接口检测到网络连接断开,将 挂断信号发送给控制进程(会话期首进程)。如果会话期首进程终止,那么该信号发送到该 会话期前台进程组。一个进程退出导致一个孤儿进程组中产生时,如果任意一个孤儿进程 组进程处于STOP状态,发送SIGHUP和SIGCONT信号到该进程组中所有进程。因此当网络断开或终端窗口关闭后,控制进程收到SIGHUP信号退出,会导致该会 话期内其他进程退出。1)nohup命令运行由Command参数和任何相关的Arg参数指定的命令,忽略所有挂 断(SIGHUP)信号。在注销后使用nohup命令运行后台中的程序。要运行后台中的nohup 命令,添加& (表示“and”的符号)到

13、命令的尾部。启动作业的终端被称为这个作业的控制终端。当您注销时,一些shell (缺省情况下不 是bash)将向这些后台作业传送SIGHUP信号,从而导致这些进程退出。为了保护进程以 免产生这种行为,当您启动进程时,请使用nohup。setsid: .调用setsid以创立一个新会话。使调用进程:a.成为新会话的首进程, b.成为一个新进程组的组长进程,c.没有控制终端。可以使用setsid命令让一个进程在新的会话中运行,也就是不再属于当前的 控制终端,当终端结束时,也就不会收到终端发来的SIGHUP信号。Screen是一个可以在多个进程之间多路复用一个物理终端的窗口管理器。 Screen中有

14、会话的概念,用户可以在一个screen会话中创立多个screen窗口, 在每一个screen窗口中就像操作一个真实的telneVSSH连接窗口那样。不中断screen窗口中程序的运行而暂时断开(detach) screen会话,并在随后时间重新连 接(attach)该会话,重新控制各窗口中运行的程序。screen发送命令使用了特殊的键组合C- a。这是因为我们在键盘上键入的信息是直接发送给当前screen窗口,必须用其他方式向screen 窗口管理器发出命令,默认情况下,screen接收以Ca开始的命令。710操作时返回的错误代码EINTR表示什么意思?应该如何应对这种情况?答:EINTR错误

15、的产生:当阻塞于某个慢系统调用的一个进程捕获某个信号且相应信号处 理函数返回时,该系统调用可能返回一个EINTR错误。例如:在socket服务器端,设置了信号 捕获机制,有子进程,当在父进程阻塞于慢系统调用时由父进程捕获到了一个有效信号时,内核 会致使accept返回一个EINTR错误(被中断的系统调用)。1)当碰到EINTR错误的时候,可以采取有一些可以重启的系统调用要进行重启,而对于有 一些系统调用是不能够重启的。例如:accept、read、write select、和open之类的函数来说, 是可以进行重启的。不过对于套接字编程中的connect函数我们是不能重启的,假设connect

16、函数 返回一个EINTR错误的时候,我们不能再次调用它,否那么将立即返回一个错误。针对connect 不能重启的处理方法是,必须调用select来等待连接完成。2)有时候,在调用系统调用时,可能会接收到某个信号而导致调用退出。譬如使用system 调用某个命令之后该进程会接收到SIGCHILD信号,然后如果这个进程的线程中有慢系统调用, 那么接收到该信号的时候可能就会退出,返回EINTR错误码。重新定义系统调用,忽略错误码为 EINTR的情况。8请编写一段c程序,完成以下功能:在父子两个进程之间通过共享内存段传递数据。include #include #include #include #in

17、clude include #include #define SHM_FILE shmfileint main(void)key_t key;pid_t pid;int shmid;char* des;char* shmaddr;char str10 = 123456789;II16I1738I16I1738I16I1738)if(shmid = shmget(key, 10, IPC_CREAT|IPC_EXCL|S_IRUSR|S_IWUSR) =-1)perror(shmget);return -1;if ( (pid = fork() shmaddr, 10);)if(shmdt(de

18、s) = -1) perror(shmdt); return -1;)printf(M%snstr);If (shmdt(shmaddr) = -1)Perror(rrshmdt);Return -1;return 0;9 select系统调用有什么用处,请用一段例如代码表示,并请阐述原理。答:select。系统调用可以使进程检测同时等待的多个I/O设备,当没有设备准备好时,select。 阻塞,其中任一设备准备好时,select。就返回。int select(int maxfd, fd_set *readfds, fd_set *writefds, fe_set *exceptfds, co

19、nst struct timeval *timeout);select的第一个参数是文件描述符集中要被检测的比特数,这个值必须至少比待检测的最大文件 描述符大1;参数readfds指定了被读监控的文件描述符集;参数writefds指定了被写监控的文 件描述符集;而参数exceptfds指定了被例外条件监控的文件描述符集。参数timeout起了定时 器的作用:到了指定的时间,无论是否有设备准备好,都返回调用。#include #include #include #include int main(void)char rbuf10;fd_set rd_fds;int retlen;struct timeval tv;tv.tv_sec = 3;tv.tv_usec = 0;I-26.27.28 I-I-26.27.28 FD_SET(STDIN_FILENO,&rd_fds);tv.tv_sec = 3;tv.tv_usec = 0;ret = select(lJ&rd_fdsJNULLJNULLJ&tv);if(ret 0)perror(select);break;else if(ret = 0)printf(timeoutjgoto next loopn);elseprintf(ret = %dn,ret);if(FD_ISSET(STDIN_FILENO,&rd_f

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论