习题答案全linux.docx
《习题答案全linux.docx》由会员分享,可在线阅读,更多相关《习题答案全linux.docx(17页珍藏版)》请在冰豆网上搜索。
![习题答案全linux.docx](https://file1.bdocx.com/fileroot1/2022-11/30/ae1c18f4-c24c-4677-b9df-a5f9f7ad0d6f/ae1c18f4-c24c-4677-b9df-a5f9f7ad0d6f1.gif)
习题答案全linux
一、选择题
1.下列那个命令不是显示多个环境变量的C
A.setB.exportC.pwdD.env
2.获取某个环境变量值使用函数A
A.getenvB.putenvC.setenvD.unsetenv
3.文件系统保存在磁盘的B
A.引导块B.超级块节点块D.数据块
4.Linux文件系统的根目录的i节点号为C
A.0B.1
5.文件描述符的数据类型是B
A.char
6.设置文件偏移量的系统调用是C
A.truncateB.syncC.lseek
7.下面那个不是lseek第三个参数的取值C
8.Sync系统调用的功能是A
A.刷新所有缓存到磁盘B.刷新缓存中某个文件的所有信息到磁盘
C.刷新缓存中某个文件的数据到磁盘D.刷新磁盘中某个文件的属性信息到磁盘
9.Fsync系统调用的功能是B
A.刷新所有缓存到磁盘B.刷新缓存中某个文件的所有信息到磁盘
C.刷新缓存中某个文件的数据到磁盘D.刷新磁盘中某个文件的属性信息到磁盘
10.Fdata系统调用的功能是C
A.刷新所有缓存到磁盘B.刷新缓存中某个文件的所有信息到磁盘
C.刷新缓存中某个文件的数据到磁盘D.刷新磁盘中某个文件的属性信息到磁盘
11.可以使用(C)系统调用获得符号链接所引用文件名称
12.获得工作路径名称的系统调用是A
13.通过文件属性中的uid获得文件拥有者名字的系统调用是B
14.通过文件属性中的gid获得文件所属组名字的系统调用是C
15.根据文件路径来改变文件权限使用系统调用是B
二、填空题
1.关于Linux的版本有两种不同的称呼:
一种是内核版本,一种是发行版本。
2.Vi的三中工作模式:
插入模式、命令模式、末行模式。
3.Gcc生成可执行文件的四个步骤:
预处理、编译、汇编、链接。
4.Makefile用来描述程序或工程中各个文件之间的相互联系
5.make。
命令用来及时makefile文件中的命令
6.库分为静态库和共享库。
7.命令行参数是main。
函数的参数
8.Main函数的参数若有两个参数则第一个参数代表命令行参数个数、第二个参数代表指向各命令行参数字符串的指针数组。
9.Linux中日期时间的表示方法有:
算术类型、结构体类型、字符串类型。
10.使用time函数获得的时间是算术类型、代表自1970年1月1日零时到当前时间的秒数。
11.把算数类型时间表示转换成结构体类型使用()函数localtime。
12.把算数类型时间表示转换成字符串类型使用()函数ctime。
13.Maketime函数把()类型时间表示转换成()类型时间表示结构体、算术。
14.如果一个C程序的入口表示为main(intargc,char*argv[]),编译该程序后的可执行程序为,那么在命令“./–ffoo”后,main中的参数argv[1]指向的字符串是(“-f”)。
15.Linux系统下表示标准输入、标准输出和标准错误输出的文件描述符(符号表示)分别为(STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO),它们的值分别为0、1、2。
16.数字635表示的权限使用字母的方式表示为(rw—wxr-x)、使用符号方式表示为(S_IRUSR|S_IWUSR|S_IWGRP|S_IXGRP|S_IROTH|S_IXOTH)。
17.系统调用open的功能是打开或创建文件。
18.使用open打开文件时有三个标志必须要选择其一,这三个标志是O_RDONLY、O_WRONLY、O_RDWR。
19.文件偏移量代表下一次读或写的位置。
20.将文件偏移量市值为当前偏移处之前的4个字节的维护使用lseek(fd,(-4),(SEEK_CUR))。
21.设置打开文件标志(O_TRUNC),可以截断文件为0,使用系统调用(truncate)可以截断文件或者加长文件。
22.如果umask设置为022,则创建一个新文件夹(数字表示)的权限为(644)、创建一个新目录的权限为(755)。
23.如果umask设置为024,则创建一个新文件夹(数字表示)的权限为(642)、创建一个新目录的权限为(753)。
24.使用系统调用(umask)可以设置和得到文件模式的屏蔽字。
25.创建硬链接使用系统调用(link),创建符号链接使用系统调用(symlink)。
26.获得工作路径名称的系统调用是(getcwd)。
27.可以使用(stat或fstat或lstat)系统调用显示文件属性信息。
28.chmod,chown,utime都可以修改文件i节点信息,其中chmod的功能是(更改文件权限)、chown的功能是(更改文件所有者和所属组)、utime的功能是(更改文件访问时间和修改时间)。
29.若实现将标准输出重定向到文件描述符为6对应的文件上,则应使用语句(dup2(6,1))。
30.系统调用(Unlink)的作用是删除目录项,这里的目录项是指(文件名和文件i节点的对应关系)。
31.打开目录使用(DIR*opendir(constchar*name))系统调用,关闭目录使用(intclosedir(DIR*dir))系统调用,读取目录内容使用(structdirent*readdir(DIR*dir))系统调用。
32.chdir系统调用的功能是(改变当前目录)。
33.创建目录使用(intmkdir(constchar*pathname,mode_tmode))系统调用、删除目录使用(intrmdir(constchar*pathname))系统调用。
三、简答题
1.关于Linux的版本有两种不同的称呼:
一种是内核版本,一种是发行版本。
2.简述Linux操作系统的特点
3.系统调用、库函数的区别和练习
从用户角度观察,系统调用和库函数都以C函数形式出现,提供给用户一种功能实现的接口,需要用户输入指定的参数,调用结束得到指定的返回值。
从实现者角度观察,库函数是在系统调用上层的函数,库函数一般指程序员可以使用的通用函数。
系统调用由两部分组成:
(1)核心函数:
是实现系统调用功能的代码,作为操作系统的核心驻留在内存中,是一种共享代码。
运行在核心态。
(2)接口函数:
是提供给应用程序的API,以库函数的形式存在于Linux的中,该库中存放了所有系统调用的接口函数的目标代码,用汇编语言书写。
其主要功能是把系统调用号,入口参数地址传给相应的核心函数,并使用户态下运行的应用程序陷入核心态。
4.完成如下命令
(1)新建用户tom和用户组student
#useraddtom
#passwdtom
#groupaddstudent
(2)新建文件file
#touchfile
(3)将文件file改名为test,然后将test拷贝到/home
#mvfiletest
#cptest/home
(4)将/home/test文件的拥有着修改为tom,将文件所属组该为student
#chowntom:
student/home/test
5.静态库和共享库的区别
(1)静态库的代码在编译时就已连接到开发人员开发的应用程序中。
(2)共享库只是在程序开始运行时才载入,在编译时,只是简单地指定需要使用的库函数。
(3)静态库文件以.a结尾,共享库文件以.so结尾。
6.Makefile文件的显式规则是什么
目标文件:
依赖文件列表
更新目标文件使用的命令
7.Linux文件类型主要有哪七类
常规文件、目录文件、字符设备文件、块设备文件、管道文件、链接文件、套接字文件
8.简述文件、i节点、文件名、目录之间的关系
每个存在磁盘上的文件都由i节点和数据块两部分组成,i节点和文件一一对应,一个i节点可以对应多个文件名,文件名和i节点的对应关系叫做文件的硬链接,文件名和i节点的对应关系保存在目录文件中。
9.什么是文件描述符
(1)一个非负整数,内核以此来标识一个特定进程正在操作的文件。
(2)012代表三个标准的文件描述符,分别为标准输入、标准输出、标准错误输出
10.使用符号方式表示rwxrwxrwx权限
S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IWGRP|S_IXGRP|S_IROTH|S_IWOTH|S_IXOTH
11.写出open一下6种打开标志:
只读、只写、读写、追加、文件不存在创建、截断为0
O_RDONLYO_WRONLYO_RDWRO_APPENDO_CREATO_TRUNC
12.读程序,写出执行结果并解释得到该结果的原因
main()
{
intfd1,fd2;
fd1=open(“/etc/passwd”,O_RDONLY);
fd2=open(“/etc/passwd”,O_RDWR);
printf(“fd1=%d,fd2=%d\n”,fd1,fd2);
close(fd1);
close(fd2);
}
结果:
fd1=3fd2=4
原因:
open返回的文件描述符为最小可用的非负整数,012是三个标准的文件描述符默认已经被占用,所以第一个open的返回值为3,第二个open返回的是4。
13.回答stat、fstat、latat三个系统调用的区别
stat根据路径获得文件元数据信息
fstat根据文件描述符获得文件元数据信息
前两者如果遇到符号链接文件则会一直引用至非符号链接文件
lstat获得符号链接文件本身的文件元数据信息
14.dup和dup2的区别和联系
联系:
dup与dup2都用来将新文件描述符指向原来文件描述符指向的打开文件描述。
区别:
dup返回的新文件描述符为最小可用的文件描述符,dup2返回的新文件描述符可以通过第二个参数指定。
15.硬链接和符号链接的区别
(1)命令
ln原文件硬链接文件(不能对目录创建硬链接)
ln–s原文件/目录符号链接文件
(2)是否新增文件:
硬链接不增文件,符号链接增加文件。
(3)删除原文件/目录
硬链接:
对应i节点链接数-1。
符号链接:
符号链接文件失效。
(4)删除链接文件
删除硬链接文件,使对应i节点的链接数-1。
删除符号链接文件,对原文件/目录无任何影响
(5)是否跨文件系统:
硬链接不可以,符号链接可以
16.fork与vfork区别
(1)fork创建的子进程复制父进程的整个地址空间,vfork不创建这一副本,子进程借用父进程的地址空间,直到其调用exec族函数或终止;
(2)fork创建的子进程和父进程相互独立地运行,而vfork创建子进程后挂起父进程,直到子进程终止或调用exec族函数。
17.阅读以下代码,若execlp调用成功的话,“Done!
”会打印输出吗为什么
#include<>
intmain()
{
printf(“Runningpswithexeclp\n”);
execlp(“ps”,”ps”,”-af”,0);
printf(“Done!
\n”);
exit(0);
}
不会输出“Done!
”。
原因:
执行execlp(“ps”,”ps”,”-af”,0)调用成功后,当前进程的地址空间被新的程序ps所替代,将执行“ps-af”
18.试写出下列程序段的运行结果,并解释原因
intx=0,inty=0;
voidthread1(void)
{
printf(“Thisissentence1\n”);
y=7;
sleep
(1);
printf(“Thisissentence2\n”);
x=x+y;
}
voidthread2(void)
{
printf(“Thisissentence1\n”);
x=4;
sleep
(1);
printf(“Thisissentence1\n”);
y=8+y;
}
voidmain(void)
{
pthread_tid1,id2;
pthread_create(&id1,NULL,(void*)thread1,NULL);
pthread_create(&id2,NULL,(void*)thread2,NULL);
pthread_join(id1,NULL);
pthread_join(id2,NULL);
printf(“x=%d,y=%d\n”,x,y);
}
答案:
Thisissentense1
Thisissentense1
Thisissentense2
Thisissentense2
x=11,y=15
原因:
(1)线程1先运行,线程2后运行。
线程1执行sleep
(1);后阻塞,线程2继续执行,线程2执行到sleep
(1);时线程2阻塞,线程1阻塞结束继续执行,线程1执行结束后线程继续执行到结束。
(2)线程1和线程2共享进程的数据段,因此共享变量x,y。
19.进程间通信的六种方式是什么简述他们的通信原理
(1)信号:
用于通知接收进程有某种事件发生。
(2)管道:
连接一个进程的输出至另一个进程的输入的一种方法。
(3)信号量:
一个计数器,用来记录对某个资源的使用情况。
(4)共享内存:
允许多个进程访问同一块内存空间。
(5)消息队列:
消息的链表,链表中每个节点包括消息类型和正文两部分。
(6)套接字:
在网络上主机间进程进行通信的方式。
20.PIPE与FIFO的区别与联系
PIPE为未命名管道,FIFO为命名管道。
联系:
PIPE和FIFO都是单向传输,一端为读,另一端为写。
区别:
PIPE只能在有亲缘关系的进程中使用,如父子进程;
FIFO有名字,所以只要知道该名字,无关进程之间也可以使用。
21.书名产生信号的几种方式
(1)用户操作。
如键盘操作Ctrl-C,最终使得内核产生信号SIGINT。
(2)进程执行出错。
如浮点数溢出,内核也会产生信号。
(3)进程执行某个系统调用。
如调用kill向某个进程或进程组发送信号。
22.说明信号传递的过程。
(1)生成(generating)。
内核要更新目标进程的数据结构,表示一个新的信号已经被发送给此进程。
此时,进程并没有对信号做出任何响应。
(2)传递(delivery)。
强迫目标进程对信号做出响应。
套接字类型(字节流套接字、数据报套接字、原是套接字)
面向连接套接字通信过程图示P242
无连接套接字通信过程图示P243
三、编程题
1.向文件f1中写入“helloworld!
”,然后再将f1中的内容读出并显示在屏幕上。
(注意必要的错误判断)
#include<>
#include
#include
intmain()
{
intfd;
charbuf1[13]={"helloworld!
"};
charbuf2[12];
intnum;
fd=open("f1",O_RDWR|O_CREAT|O_TRUNC,0644);
if(fd==-1)
{
perror("f1notopen");
exit
(1);
}
num=write(fd,buf1,sizeof(buf1)-1);
if(num!
=(sizeof(buf1)-1))
printf("writelessthanwant\n");
lseek(fd,0,SEEK_SET);
num=read(fd,buf2,12);
if(num!
=12)
printf("readlessthan12\n");
write(1,buf2,12);
close(fd);
}
2.向文件f2中写入“aabbccddee”,然后将偏移量移到绝对值偏移为4的位置处,读6个字符,并将结果显示在屏幕上
#include<>
#include
#include
intmain()
{
intfd;
charbuf1[11]={"aabbccddee"};
charbuf2[10];
intnum;
fd=open("f2",O_RDWR|O_CREAT|O_TRUNC,0644);
if(fd==-1)
{
perror("f2notopen");
exit
(1);
}
num=write(fd,buf1,sizeof(buf1)-1);
if(num!
=(sizeof(buf1)-1))
printf("writelessthanwant\n");
lseek(fd,4,SEEK_SET);
num=read(fd,buf2,6);
if(num!
=6)
printf("readlessthan6\n");
write(1,buf2,6);
close(fd);
}
3.向文件f3中写入“aabbccddeeffgghh”,然后将文件截短后的文件内容读出并显示在屏幕上
#include<>
#include
#include
intmain()
{
intfd;
charbuf1[17]={"aabbccddeeffgghh"};
charbuf2[8];
intnum;
fd=open("f3",O_RDWR|O_CREAT|O_TRUNC,0644);
if(fd==-1)
{
perror("f3notopen");
exit
(1);
}
num=write(fd,buf1,sizeof(buf1)-1);
if(num!
=(sizeof(buf1)-1))
printf("writelessthanwant\n");
lseek(fd,0,SEEK_SET);
ftruncate(fd,8);
num=read(fd,buf2,8);
if(num!
=8)
printf("readlessthan8\n");
write(1,buf2,8);
close(fd);
}
4.在程序中将umask改至044,创建文件f4
#include<>
#include
#include
intmain()
{
intfd;
umask(044);
creat("f4",S_IRUSR|S_IWUSR);
}
5.实现“cat文件名”显示文件内容
#include<>
main(intargc,char*argv[])
{
intfd;
intnum;
charbuf[10];
if(argc!
=2)
{
printf("missfilename\n");
exit
(1);
}
fd=open(argv[1],O_RDONLY);
if(fd==-1)
{
perror("erroropen");
exit
(1);
}
while((num=read(fd,buf,10))!
=0)
write(1,buf,num);
close(fd);
}
6.实现“cp原文件目标文件”
#include
#include<>
main(intargc,char*argv[])
{
intfrom,to;
intnum;
charbuf[10];
if(argc!
=3)
{
printf("argumenterror\n");
exit
(1);
}
from=open(argv[1],O_RDONLY);
to=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0644);
num=read(from,buf,10);
while(num!
=0)
{
write(to,buf,num);
num=read(from,buf,10);
}
close(from);
close(to);
}
1.编写程序,将字符串“helloworld”通过输出重定向方式写入文件f1中
#include<>
#include<>
#include<>
#include
#include
main()
{
intfd;
if((fd=open("f1",O_WRONLY|O_CREAT,0644))==-1)
perror("openfail");
if(dup2(fd,1)==-1)
perror("Redirectfailed");
printf("Helloworld\n");
close(fd);
}
第六章编程题略。
1.使用fork创建进程,在子进程中打印“Iamthechild”和子进程pid,在父进程中打印“Iamthefather”和父进程pid
#include
#include<>
#include<>
intmain()
{
pid_tpid;
pid=fork();
if(pid<0)
{
perror("fork");
exit
(1);
}
elseif(pid==0)
printf("Iamthechild\n");
else
printf("Iamthefather\n");
exit(0);
}
2.创建子进程,在子进程中执行“ps-A”命令,父进程等待子进程结束后打印“childover”
及所处理的子进程进程号
#include
#include<>
main()
{
pid_tpid,cpid;
inti;
char*args[64];
args[0]=”ps”;
args[1]=”-A”;
args[2]=NULL;
pid=fork();
if(pid<0)
{
perror(“fork”);
exit
(1);
}
elseif(pid==0)
{
execvp(args[0],args);
exit(0);
}
else
{
cpid=wait(NULL);
printf(“childover!
cpid=%d\n”,cpid);
}
}
第八章编程题略
1.编写程序处理SIGINT信号,当程序接收到SIGINT信号后输出“SIGINTiscaught”
#include<>
#include<>
voidsignal_handler(int