最新第1-4章习题参考答案

最新第1-4章习题参考答案
最新第1-4章习题参考答案

第1章

一、简答题

1.关于Linux的版本有两种不同的称呼:

一种是内核版本,一种是发行版本。

2.简述Linux操作系统的特点

3.系统调用、库函数的区别和练习

从用户角度观察,系统调用和库函数都以C函数形式出现,提供给用户一种功能实现的接口,需要用户输入指定的参数,调用结束得到指定的返回值。

从实现者角度观察,库函数是在系统调用上层的函数,库函数一般指程序员可以使用的通用函数。

系统调用由两部分组成:

(1)核心函数:是实现系统调用功能的代码,作为操作系统的核心驻留在内存中,是一种共享代码。运行在核心态。

(2)接口函数:是提供给应用程序的API,以库函数的形式存在于Linux的lib.a中,该库中存放了所有系统调用的接口函数的目标代码,用汇编语言书写。其主要功能是把系统调用号,入口参数地址传给相应的核心函数,并使用户态下运行的应用程序陷入核心态。

4.完成如下命令

(1)新建用户tom 和用户组student

#useradd tom

#passwd tom

#groupadd student

(2)新建文件file

#touch file

(3)将文件file 改名为test,然后将test拷贝到/home

#mv file test

#cp test /home

(4)将/home/test文件的拥有着修改为tom,将文件所属组该为student

#chown tom:student /home/test

第2章

一、填空题

1.Vi的三中工作模式:插入模式、命令模式、末行模式。

2.Gcc生成可执行文件的四个步骤:预处理、编译、汇编、链接。

3.Makefile 用来描述程序或工程中各个文件之间的相互联系

4.make。命令用来及时makefile文件中的命令

5.库分为静态库和共享库。

二、简答题

1.静态库和共享库的区别

(1)静态库的代码在编译时就已连接到开发人员开发的应用程序中。

(2)共享库只是在程序开始运行时才载入,在编译时,只是简单地指定需要使用的库函数。

(3)静态库文件以.a结尾,共享库文件以.so结尾。

2.Makefile 文件的显式规则是什么?

目标文件:依赖文件列表

更新目标文件使用的命令

三、编程题

1.编写makefile:当前目录下有文件a1.c a2.c a3.c ,其中a1.c中带有main函数,其他文件为用户自定义函数供main函数调用,编写完成对这几个文件的编译工作生成可执行文件a CC=gcc

BIN=a

$(BIN):a1.o a2.o a3.o

$(CC) -o $(BIN) $^

a1.o:a1.c

$(CC) -c a1.c

a2.o:a2.c

$(CC) -c a2.c

a3.o:a3.c

$(CC) -c a3.c

clean:

rm -f *.o $(BIN)

2.编写makefile:当前目录下有很多独立的程序文件:aa.c bb. C cc .c(即每个文件中都有main函数),分别要生成对应的我可执行文件aabbcc,为了方便用户操作,写一个makefile 使得调用make命令会重新编译最新修改的程序文件

CC=gcc

ALL:aa bb cc

aa:aa.c

$(CC) -o aa aa.c

bb:bb.c

$(CC) -o bb bb.c

cc:cc.c

$(CC) -o cc cc.c

clean:

rm -f aa bb cc

第3章

一、选择题

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

Aset Bexport Cpwd Denv

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

A.getenv B.putenv C.setenv D.unsetenv

二、填空题

1.命令行参数是main。函数的参数

2.Main函数的参数若有两个参数则第一个参数代表命令行参数个数、第二个参数代表指向各命令行参数字符串的指针数组。

3.Linux 中日期时间的表示方法有:算术类型、结构体类型、字符串类型。

4.使用time函数获得的时间是算术类型、代表自1970年1月1日零时到当前时间的秒数。5.把算数类型时间表示转换成结构体类型使用()函数localtime。

6.把算数类型时间表示转换成字符串类型使用()函数ctime。

7.Maketime函数把()类型时间表示转换成()类型时间表示结构体、算术。

8.如果一个C程序的入口表示为main(int argc,char *argv[]),编译该程序后的可执行程序为a.out,那么在命令“./a.out –f foo”后,main中的参数argv[1]指向的字符串是(“-f”)。

三、编程题

1.如果一个用户输入一个参数,则打印“no args”,如果输入两个参数并且第二个命令行参数是-a,则打印“I will deal with -a”,如果是-l则打印“I will deal with -l”

#include

int main(int argc,char *argv[])

{

if(argc==1)

printf("no args\n");

else if(argc==2)

{

if(strcmp(argv[1],"-a")==0)

printf("I will deal with -a\n");

if(strcmp(argv[1],"-l")==0)

printf("I will deal with -l\n");

}

return 0;

}

第4章

一、选择题

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

A.引导块

B.超级块

C.i节点块

D.数据块

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

A. 0

B. 1

C.2

D.3

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

A. char

B.int

C.double

D.float

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

A. truncate

B. sync C . lseek D.create

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

A.SEEK_SET

B.SEEK_CUR

C.SEEK_NOW

D.SEEK_END

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

A.刷新所有缓存到磁盘

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

C.刷新缓存中某个文件的数据到磁盘

D.刷新磁盘中某个文件的属性信息到磁盘7.Fsync系统调用的功能是B

A.刷新所有缓存到磁盘

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

C.刷新缓存中某个文件的数据到磁盘

D.刷新磁盘中某个文件的属性信息到磁盘

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

A.刷新所有缓存到磁盘

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

C.刷新缓存中某个文件的数据到磁盘

D.刷新磁盘中某个文件的属性信息到磁盘

二、填空题

1.Linux系统下表示标准输入、标准输出和标准错误输出的文件描述符(符号表示)分别为(STDIN_FILENO、STDOUT_FILENO 、STDERR_FILENO),它们的值分别为0、1、2。2.数字635表示的权限使用字母的方式表示为(rw—wxr-x)、使用符号方式表示为(S_IRUSR | S_IWUSR | S_IWGRP | S_IXGRP | S_IROTH | S_IXOTH)。

3.系统调用open的功能是打开或创建文件。

4.使用open打开文件时有三个标志必须要选择其一,这三个标志是O_RDONL Y、O_WRONL Y、O_RDWR。

5.文件偏移量代表下一次读或写的位置。

6.将文件偏移量市值为当前偏移处之前的4个字节的维护使用lseek(fd,(-4),(SEEK_CUR))。

7.设置打开文件标志(O_TRUNC),可以截断文件为0,使用系统调用(truncate)可以截断文件或者加长文件。

8.如果umask设置为022,则创建一个新文件夹(数字表示)的权限为(644)、创建一个新目录的权限为(755)。

9.如果umask设置为024,则创建一个新文件夹(数字表示)的权限为(642)、创建一个新目录的权限为(753)。

三、简答题

1.Linux文件类型主要有哪七类?

常规文件、目录文件、字符设备文件、块设备文件、管道文件、链接文件、套接字文件2.简述文件、i节点、文件名、目录之间的关系

每个存在磁盘上的文件都由i节点和数据块两部分组成,i节点和文件一一对应,一个i节点可以对应多个文件名,文件名和i节点的对应关系叫做文件的硬链接,文件名和i节点的对应关系保存在目录文件中。

3.什么是文件描述符?

(1)一个非负整数,内核以此来标识一个特定进程正在操作的文件。

(2)012代表三个标准的文件描述符,分别为标准输入、标准输出、标准错误输出

4.使用符号方式表示rwxrwxrwx权限

S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IWGRP|S_IXGRP|S_IROTH|

S_IWOTH|S_IXOTH

5.写出open一下6种打开标志:只读、只写、读写、追加、文件不存在创建、截断为0 O_RDONL Y O_WRONLY O_RDWR O_APPEND O_CREAT O_TRUNC 6.读程序,写出执行结果并解释得到该结果的原因

main()

{

int fd1,fd2;

fd1=open(“/etc/passwd”,O_RDONL Y);

fd2=open(“/etc/passwd”,O_RDWR);

printf(“fd1=%d,fd2=%d\n”,fd1,fd2);

close(fd1);

close(fd2);

}

结果:fd1=3 fd2=4

原因:open返回的文件描述符为最小可用的非负整数,012是三个标准的文件描述符默认已经被占用,所以第一个open的返回值为3,第二个open返回的是4。

五、编程题

1.向文件f1中写入“hello world!”,然后再将f1中的内容读出并显示在屏幕上。(注意必要的错误判断)

#include

#include

#include

int main()

{

int fd;

char buf1[13]={"hello world!"};

char buf2[12];

int num;

fd = open( "f1",O_RDWR| O_CREAT | O_TRUNC, 0644);

if(fd==-1)

{

perror("f1 not open");

exit(1);

}

num=write(fd,buf1,sizeof(buf1)-1);

if(num!=(sizeof(buf1)-1))

printf("write less than want\n");

lseek(fd,0,SEEK_SET);

num=read(fd,buf2,12);

if(num!=12)

printf("read less than 12\n");

write(1,buf2,12);

close(fd);

}

2.向文件f2中写入“aabbccddee”,然后将偏移量移到绝对值偏移为4的位置处,读6个字符,并将结果显示在屏幕上

#include

#include

#include

int main()

{

int fd;

char buf1[11]={"aabbccddee"};

char buf2[10];

int num;

fd = open( "f2",O_RDWR| O_CREAT | O_TRUNC, 0644);

if(fd==-1)

{

perror("f2 not open");

exit(1);

}

num=write(fd,buf1,sizeof(buf1)-1);

if(num!=(sizeof(buf1)-1))

printf("write less than want\n");

lseek(fd,4,SEEK_SET);

num=read(fd,buf2,6);

if(num!=6)

printf("read less than 6\n");

write(1,buf2,6);

close(fd);

}

3.向文件f3中写入“aabbccddeeffgghh”,然后将文件截短后的文件内容读出并显示在屏幕上

#include

#include

#include

int main()

{

int fd;

char buf1[17]={"aabbccddeeffgghh"};

char buf2[8];

int num;

fd = open( "f3",O_RDWR| O_CREAT | O_TRUNC, 0644);

if(fd==-1)

{

perror("f3 not open");

exit(1);

}

num=write(fd,buf1,sizeof(buf1)-1);

if(num!=(sizeof(buf1)-1))

printf("write less than want\n");

lseek(fd,0,SEEK_SET);

ftruncate(fd,8);

num=read(fd,buf2,8);

if(num!=8)

printf("read less than 8\n");

write(1,buf2,8);

close(fd);

}

4.在程序中将umask改至044,创建文件f4 #include

#include

#include

int main()

{

int fd;

umask(044);

creat("f4",S_IRUSR|S_IWUSR);

}

5.实现“cat文件名”显示文件内容

#include

main(int argc,char *argv[])

{

int fd;

int num;

char buf[10];

if(argc!=2)

{

printf("miss filename\n");

exit(1);

}

fd=open(argv[1],O_RDONL Y);

if(fd==-1)

{

perror("error open");

exit(1);

}

while((num=read(fd,buf,10))!=0)

write(1,buf,num);

close(fd);

}

6.实现“cp 原文件目标文件”

#include

#include

main(int argc,char *argv[])

{

int from,to;

int num;

char buf[10];

if(argc!=3)

{

printf("argument error\n");

exit(1);

}

from=open(argv[1],O_RDONL Y);

to=open(argv[2],O_WRONL Y|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);

}

相关主题
相关文档
最新文档