12007–2008上学期基于Linux的程序设计A卷答案一、选择题(共10题,每题2分,共20分)1.C2.A3.D4.B5.C6.B7.B8.A9.A10.C二、填空题(共13题,每空1分,共15分)11.管道(或者“|”)12.字符界面13.流式socket(流式套接字,SOCK_STREAM),数据报式socket(数据报式套接字,SOCK_DGRAM)14.catfile1file2file315.shift16.编程语言bash17.空格18.;19.getppid()20.-v21.在第10行设置断点22.ls–l/root(写成ls–l也算对)23.wqtest.txt(或者xtest.txt)三、简答题(共2题,共10分)22.试分别说明Linux下shell程序和C程序从编写到运行的一般步骤。(本题满分5分)(1)在linux的命令提示符下启动编辑器,如输入vi,启动vi编辑器。(2)输入程序的内容,然后保存,退出。(3)如果编写的是shell程序,在运行前需要增加执行权限,可通过如下语句:chmod+xfilename如果编写的是c程序,则进行编译,GCC源文件–o目标文件。(4)如果发现程序有语法错误或者逻辑错误,则需要继续调试程序,直至程序无任何语法错误或逻辑错误。(5)运行程序./可执行文件名23.vi编辑器有哪几种工作模式?各工作模式之间如何进行转化?(本题满分5分)vi有三种工作模式:命令行模式,文本输入模式,末行模式。各模式之间的切换如下图所示::键Esc键文本插入命令自动返回shell提示符命令模式插入模式末行模式启动vi退出vi2四、读程序题(共2题,共20分)24beforefork,var=10Thisischildafterforkvar=9beforefork,var=10Thisisparent!afterforkvar=11程序的执行过程如下:程序先定义了两个变量result和var,然后输出变量var的值,得到beforeforkvar=10这一行输出(父子进程各复制了一份)。当执行到result=fork()时程序分叉,产生父子两个进程。系统首先调度子进程执行,直至子进程结束。(题目假定父子进程均可在一个时间片内执行完,且操作系统每次均先调度子进程。)而在子进程中result为0,故走的是条件分支的最后一个分支,输出:Thisischild.afterforkvar=9子进程执行完了之后调度父进程执行,直至父进程结束。而在父进程中result为子进程号,大于0,于是走条件分支的第二个个分支,输出:Thisisparentafterforkvar=1125#!/bin/shFILENAME=echo-nInputfilename:readFILENAMEif[!-f$FILENAME]thenexitfiif[!-s$FILENAME]thenrm$FILENAMEelsecat$FILENAMEfi五、编程题(共3题,共35分)26.假如你是机房系统管理员,某班上的80个学生在机房的Linux服务器上共创建了80个帐号,帐号名为“user20060001”~“user20060080”,现在课程结束了,这些帐号均不再使用。试编写一个shell程序,删除学生所建的上述帐号。(本题满分12分)参考程序如下:3#!/bin/shi=1while[$i-le80];doif[$i-le9]thenUSERNAME=user2006000$ielseUSERNAME=user200600$i;fiif[-d/home/$USERNAME];thenuserdel-r$USERNAMEfileti=i+1done27.试编写一个简单的C程序,分别列出在终端tty1~tty6共6个终端上运行的所有进程。(本题满分8分)#includestdio.h#includestdlib.hmain(){charcommand[81];inti;for(i=1;i8;i++){sprintf(command,ps-ttty%d,i);system(command);}}28.设计一个程序,当用户从客户端输入“Hello,Server”,传送到服务器端,变成“Hello,Client”,送回客户端;如果从客户端输入“Hello,ABC”,传送到服务器端,则变成“Hello,abc”,送回客户端;如果从客户端输入“exit”,传送到服务器端,服务器端程序退出,不向客户端送回任何信息;上述三种情况之外的其它情况,从客户端输入的内容经服务器后均原样送回客户端。(本题满分15分)//参考程序//socket_server.c#includestdio.h#includestdlib.h#includeerrno.h#includestring.h#includesys/types.h4#includenetinet/in.h#includesys/socket.h#includesys/wait.h#defineSERVPORT3333#defineBACKLOG9main(){intsockfd,client_fd;intsin_size;intrecvbytes;structsockaddr_inmy_addr;structsockaddr_inremote_addr;charbuf[100];if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){perror(socketcreationerror);exit(1);}my_addr.sin_family=AF_INET;my_addr.sin_port=htons(SERVPORT);my_addr.sin_addr.s_addr=INADDR_ANY;bzero(&(my_addr.sin_zero),8);if(bind(sockfd,(structsockaddr*)&my_addr,sizeof(structsockaddr))==-1){perror(binderror);exit(1);}if(listen(sockfd,BACKLOG)==-1){perror(listenerror);exit(1);}while(1){sin_size=sizeof(structsockaddr_in);if((client_fd=accept(sockfd,(structsockaddr*)&remote_addr,&sin_size))==-1){perror(accepterror);continue;}printf(receivedaconnectionfrom%s\n,inet_ntoa(remote_addr.sin_addr));memset(buf,'\0',sizeof(buf));5recvbytes=recv(client_fd,buf,sizeof(buf),0);printf(therecvbytesis:%d\n,recvbytes);if(recvbytes==-1){perror(recverror!);exit(0);}printf(Receivedmsgis:%s\n,buf);if(strncmp(buf,Hello,Server,sizeof(Hello,Server))==0){memcpy(buf,Hello,Client,sizeof(Hello,Client));}if(strncmp(buf,Hello,ABC,sizeof(Hello,ABC))==0){memcpy(buf,Hello,abc,sizeof(Hello,abc));}if(strncmp(buf,exit,strlen(exit))==0){printf(theserverprogramwillexit.\n);close(client_fd);exit(0);}printf(themsgtobesentis:%s\n,buf);if(send(client_fd,buf,strlen(buf),0)==-1)perror(senderror);}}//socket_client.c#includestdio.h#includestdlib.h#includeerrno.h#includestring.h#includenetdb.h#includesys/types.h#includenetinet/in.h#includesys/socket.h#defineSERVPORT3333#defineSERVPORT18888#defineMAXDATASIZE90main(intargc,char*argv[])6{intsockfd,recvbytes,sendbytes,client_fd;charbuf[MAXDATASIZE];structhostent*host;structsockaddr_inserv_addr;structsockaddr_inmy_addr;if(argc3){fprintf(stderr,Pleaseentertheserver'shostnameandthemsgtobesent!\n);exit(1);}if((host=gethostbyname(argv[1]))==NULL){herror(gethostbynameerror);exit(1);}if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){perror(socketcreationerror!);exit(1);}serv_addr.sin_family=AF_INET;serv_addr.sin_port=htons(SERVPORT);serv_addr.sin_addr=*((structin_addr*)host-h_addr);bzero(&(serv_addr.sin_zero),8);if(connect(sockfd,(structsockaddr*)&serv_addr,sizeof(structsockaddr))==-1){perror(connecterror);exit(1);}printf(themsgtobesentis:%s\n,argv[2]);sendbytes=send(sockfd,argv[2],strlen(argv[2]),0);if(sendbytes==-1)perror(senderror);memset(buf,'\0',sizeof(buf));if((recvbytes=recv(sockfd,buf,MAXDATASIZE,0))==-1){perror(recverror);exit(1);7}printf(Received:%s\n,buf);close(sockfd);}