习题答案全linux.docx

上传人:b****9 文档编号:26212423 上传时间:2023-06-17 格式:DOCX 页数:21 大小:22.21KB
下载 相关 举报
习题答案全linux.docx_第1页
第1页 / 共21页
习题答案全linux.docx_第2页
第2页 / 共21页
习题答案全linux.docx_第3页
第3页 / 共21页
习题答案全linux.docx_第4页
第4页 / 共21页
习题答案全linux.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

习题答案全linux.docx

《习题答案全linux.docx》由会员分享,可在线阅读,更多相关《习题答案全linux.docx(21页珍藏版)》请在冰豆网上搜索。

习题答案全linux.docx

习题答案全linux

一、选择题

1.下列那个命令不是显示多个环境变量的C

A.setB.exportC.pwdD.env

2.获取某个环境变量值使用函数A

A.getenvB.putenvC.setenvD.unsetenv

3.文件系统保存在磁盘的B

A.引导块B.超级块C.i节点块D.数据块

4.Linux文件系统的根目录的i节点号为C

A.0B.1C.2D.3

5.文件描述符的数据类型是B

A.charB.intC.doubleD.float

6.设置文件偏移量的系统调用是C

A.truncateB.syncC.lseekD.create

7.下面那个不是lseek第三个参数的取值C

A.SEEK_SETB.SEEK_CURC.SEEK_NOWD.SEEK_END

8.Sync系统调用的功能是A

A.刷新所有缓存到磁盘B.刷新缓存中某个文件的所有信息到磁盘

C.刷新缓存中某个文件的数据到磁盘D.刷新磁盘中某个文件的属性信息到磁盘

9.Fsync系统调用的功能是B

A.刷新所有缓存到磁盘B.刷新缓存中某个文件的所有信息到磁盘

C.刷新缓存中某个文件的数据到磁盘D.刷新磁盘中某个文件的属性信息到磁盘

10.Fdata系统调用的功能是C

A.刷新所有缓存到磁盘B.刷新缓存中某个文件的所有信息到磁盘

C.刷新缓存中某个文件的数据到磁盘D.刷新磁盘中某个文件的属性信息到磁盘

11.可以使用(C)系统调用获得符号链接所引用文件名称

A.linkB.symlinkC.readlinkD.softlink

12.获得工作路径名称的系统调用是A

A.getcwdB.getpwuidC.getgrgidD.getlogin

13.通过文件属性中的uid获得文件拥有者名字的系统调用是B

A.getcwdB.getpwuidC.getgrgidD.getlogin

14.通过文件属性中的gid获得文件所属组名字的系统调用是C

A.getcwdB.getpwuidC.getgrgidD.getlogin

15.根据文件路径来改变文件权限使用系统调用是B

A.chownB.chmodC.fchmodD.fchown

二、填空题

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[]),编译该程序后的可执行程序为a.out,那么在命令“./a.out–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的lib.a中,该库中存放了所有系统调用的接口函数的目标代码,用汇编语言书写。

其主要功能是把系统调用号,入口参数地址传给相应的核心函数,并使用户态下运行的应用程序陷入核心态。

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(“Thisispthread1.thesentence1\n”);

y=7;

sleep

(1);

printf(“Thisispthread1.thesentence2\n”);

x=x+y;

}

voidthread2(void)

{

printf(“Thisispthread1.thesentence1\n”);

x=4;

sleep

(1);

printf(“Thisispthread1.thesentence1\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);

}

答案:

Thisispthread1.thesentense1

Thisispthread2.thesentense1

Thisispthread1.thesentense2

Thisispthread2.thesentense2

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.编写程序pro3.c,将字符串“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

print

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 哲学历史

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1