VI程序设计试题及答案2.docx
《VI程序设计试题及答案2.docx》由会员分享,可在线阅读,更多相关《VI程序设计试题及答案2.docx(16页珍藏版)》请在冰豆网上搜索。
VI程序设计试题及答案2
VI程序设计试题B
得分
评阅人
一、选择题(共10题,每题2分,共20分)
()1.下列关于Linux安装的说法中,不正确的是。
A.如果计算机的内存为128MB,则SWAP分区(交换分区)的大小通常设定为256M。
B.安装时Linux分区的文件系统类型一般为ext2或ext3。
C.安装时要进行磁盘分区,如果选择“自动分区”,系统会自动保留硬盘上原来的数据。
D.Linux除了可以从光盘安装外,还可以从网上下载Linux的iso映像文件,从硬盘安装。
()2.下列说法中,不正确的是。
A.Shell程序编写完后还需要用gcc编译器编译。
B.可以通过将shell程序作为sh命令的输入来执行shell程序。
C.shell程序中定义的函数不能有参数。
D.Linux是免费使用和自由传播的类UNIX操作系统,但它并不是没有版权。
()3.为了利用GDB调试C/C++程序,在编译时需要把调试信息加载到可执行文件中,则用GCC编译源程序时,需要利用选项。
A.–O2B.-EC.–WallD.-g
()4.$temp=’world’;echohello’$temp’
上述命令执行的结果为。
A.helloworldB.hello$tempC.hello’world’D.hello
()5.下列关于网络编程的叙述中,错误的是。
A.一个完整的网络程序应该包含两个独立的程序,它们分别运行在客户端和服务器端。
B.相同条件下UDP发送数据的速度要比TCP快。
C.当使用UDP编程时,如果函数sendto()成功返回,表示系统发出的数据被通讯的对方准确接收到了。
D.端口号是16bit的地址码,端口号和IP地址构成一个插口(socket)。
()6.某shell程序在运行时需要向脚本传递参数,则为了得到所有命令行参数的个数,我们可以使用变量。
A.$@B.$#C.$0D.$!
()7.将当前目录下的文件shell.sh移动到目录/home/linux下的命令为。
A.cpshell.sh/home/linuxB.mvshell.sh/home/linux
C.llsshell.sh/home/linux/shell.shD.mv/root/shell.sh/home/linux/shell.sh
()8.在linux下进行shell编程时,注释符是。
A.#B.//C./**/D.以上都不对
()9.任何时候用户需要回到用户主目录时可以使用命令。
A.cdB.pwdC.pathD.cd.
()10.文件exer1的访问权限为744,现要取消文件所有者的执行权限,同时增加同组用户的写权限,下列命令中正确的是。
A.chmodu+x,g+wexer1B.chmod646exer1
C.chmoda-x,g+wexer1D.chmodg+wexer1
得分
评阅人
二、填空题(共13题,每空1分,共15分)
11.就是将前一个命令的标准输出作为后一个命令的标准输入。
12.Linux有两种工作界面:
字符界面和图形界面,其中界面功能更强大。
13.常用的socket类型有两种:
和。
14.将文件file1和文件file2连接成文件file3的命令是。
15.传递给shell脚本的位置参数只有前9个可以被访问,为了访问第9个位置参数以后的参数,可以使用命令。
16.shell不仅是用户命令的解释器,同时也是一种功能强大的,是Linux缺省的shell。
17.在shell编程时,如果将测试条件置于方括号内,应注意方括号两边必须有。
18.有时用户需要在一行给出多个shell命令,假定输入的命令都需要运行,则在shell提示符下输入命令时,可在命令之间加上符号。
19.为了获得父进程的ID号,可是使用函数。
20.在用bash命令调试shell程序时,为了将shell执行的每一个命令行都显示出来,应该使用bash的选项。
21.在Linux下调试c程序时,在提示符(gdb)下输入b10表示。
22.你是公司的Linux服务的管理员。
你想查看/root下文件和文件夹的赋权的详细列表,可以使用命令。
23.在用vi编辑好文件后,为了将文件内容存入test..txt文件中并退出vi(开始进入vi时并未输入文件名),应在末行模式下键入。
得分
评阅人
三、简答题(共2题,共10分)
22.试分别说明Linux下shell程序和C程序从编写到运行的一般步骤。
(本题满分5分)
23.vi编辑器有哪几种工作模式?
各工作模式之间如何进行转化?
(本题满分5分)
得分
评阅人
四、读程序题(共2题,共20分)
24.阅读程序,写出程序的执行结果,并分析程序的执行过程。
(本题满分10分)
#include
#include
intmain()
{
pid_tresult;
intvar=10;
printf("beforefork,var=%d\n",var);
result=fork();
if(result<0)
printf("forkfail\n");
elseif(result>0)
{
var++;
printf("Thisisparent!
\n”);
}
else
{
var--;
printf("Thisischild!
\n");
}
printf("afterforkvar=%d\n",var);
return0;
}
假定父子进程均可在一个时间片内执行完,且操作系统每次均先调度子进程。
25.某Shell程序以一个普通文件作为参数,其功能是:
判断文件的大小是否为0,如果是则删除它;否则将该文件的内容输出到标准输出,请将程序补充完整。
(本题满分10分)
#!
/bin/sh
FILENAME=
echo-n"Inputfilename:
"
#输入文件名
#如果不是文件
then
#shell程序直接退出
fi
#判断该文件是否为空
then
#为空则删除它
else
cat$FILENAME#否则输出文件的内容到标准输出
fi
得分
评阅人
五、编程题(共3题,共35分)
26.假如你是机房系统管理员,某班上的80个学生在机房的Linux服务器上共创建了80个帐号,帐号名为“user20060001”~“user20060080”,现在课程结束了,这些帐号均不再使用。
试编写一个shell程序,删除学生所建的上述帐号。
(本题满分12分)
27.试编写一个简单的C程序,分别列出在终端tty1~tty6共6个终端上运行的所有进程。
(本题满分8分)
28.设计一个程序,当用户从客户端输入“Hello,Server”,传送到服务器端,变成“Hello,Client”,送回客户端;如果从客户端输入“Hello,ABC”,传送到服务器端,则变成“Hello,abc”,送回客户端;如果从客户端输入“exit”,传送到服务器端,服务器端程序退出,不向客户端送回任何信息;上述三种情况之外的其它情况,从客户端输入的内容经服务器后均原样送回客户端。
(本题满分15分)
VI程序设计试题答案
一、选择题(共10题,每题2分,共20分)
1.C2.A3.D4.B5.C
6.B7.B8.A9.A10.C
二、填空题(共13题,每空1分,共15分)
11.管道(或者“|”)
12.字符界面
13.流式socket(流式套接字,SOCK_STREAM),数据报式socket(数据报式套接字,SOCK_DGRAM)
14.catfile1file2>file315.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有三种工作模式:
命令行模式,文本输入模式,末行模式。
各模式之间的切换如下图所示:
四、读程序题(共2题,共20分)
24
beforefork,var=10
Thisischild
afterforkvar=9
beforefork,var=10
Thisisparent!
afterforkvar=11
程序的执行过程如下:
程序先定义了两个变量result和var,然后输出变量var的值,
得到"beforeforkvar=10"这一行输出(父子进程各复制了一份)。
当执行到result=fork()时程序分叉,产生父子两个进程。
系统首先调度子进程执行,直至子进程结束。
(
题目假定父子进程均可在一个时间片内执行完,且操作系统每次均先调度子进程。
)
而在子进程中result为0,故走的是条件分支的最后一个分支,输出:
Thisischild.
afterforkvar=9
子进程执行完了之后调度父进程执行,直至父进程结束。
而在父进程中result为子进程号,大于0,于是走条件分支的第二个个分支,输出:
Thisisparent
afterforkvar=11
25
#!
/bin/sh
FILENAME=
echo-n"Inputfilename:
"
readFILENAME
if[!
-f$FILENAME]
then
exit
fi
if[!
-s$FILENAME]
then
rm$FILENAME
else
cat$FILENAME
fi
五、编程题(共3题,共35分)
26.假如你是机房系统管理员,某班上的80个学生在机房的Linux服务器上共创建了80个帐号,帐号名为“user20060001”~“user20060080”,现在课程结束了,这些帐号均不再使用。
试编写一个shell程序,删除学生所建的上述帐号。
(本题满分12分)
参考程序如下:
#!
/bin/sh
i=1
while[$i-le80];do
if[$i-le9]
then
USERNAME=user2006000$i
else
USERNAME=user200600$i;
fi
if[-d/home/$USERNAME];then
userdel-r$USERNAME
fi
leti=i+1
done
27.试编写一个简单的C程序,分别列出在终端tty1~tty6共6个终端上运行的所有进程。
(本题满分8分)
#include
#include
main()
{
charcommand[81];
inti;
for(i=1;i<8;i++)
{
sprintf(command,"ps-ttty%d",i);
system(command);
}
}
28.设计一个程序,当用户从客户端输入“Hello,Server”,传送到服务器端,变成“Hello,Client”,送回客户端;如果从客户端输入“Hello,ABC”,传送到服务器端,则变成“Hello,abc”,送回客户端;如果从客户端输入“exit”,传送到服务器端,服务器端程序退出,不向客户端送回任何信息;上述三种情况之外的其它情况,从客户端输入的内容经服务器后均原样送回客户端。
(本题满分15分)
//参考程序
//socket_server.c
#include
#include
#include
#include
#include
#include
#include
#include
#defineSERVPORT3333
#defineBACKLOG9
main()
{
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));
recvbytes=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
#include
#include
#include
#include
#include
#include
#include
#include
#defineSERVPORT3333
#defineSERVPORT18888
#defineMAXDATASIZE90
main(intargc,char*argv[])
{
intsockfd,recvbytes,sendbytes,client_fd;
charbuf[MAXDATASIZE];
structhostent*host;
structsockaddr_inserv_addr;
structsockaddr_inmy_addr;
if(argc<3)
{
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);
}
printf("Received:
%s\n",buf);
close(sockfd);
}