Linux期末复习有参考答案Word格式文档下载.docx
《Linux期末复习有参考答案Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《Linux期末复习有参考答案Word格式文档下载.docx(10页珍藏版)》请在冰豆网上搜索。
![Linux期末复习有参考答案Word格式文档下载.docx](https://file1.bdocx.com/fileroot1/2022-11/24/cebd52d7-f70d-4f69-b397-bb56d1ebdaa2/cebd52d7-f70d-4f69-b397-bb56d1ebdaa21.gif)
将该文件的偏移量设置为距文件当前位置加offset个字节;
13.UNIX/Linux系统中每个文件有9个文件权限位,按照访问文件的用户身份不同可以将这些文件权限位分为三个域,分别是哪些域?
文件所有者,同组用户,其他用户
14.在UNIX/Linux系统中C程序内存空间布局包括哪些段?
栈,堆,非初始化数据段,初始化数据段,正文段
15.UNIX/Linux系统为每个进程自动打开三个文件,是什么文件?
标准输入、标准输出和标准错误文件
16.XSIIPC机制包括哪些内容?
信号量,消息队列,内存共享
17.在UNIX/Linux系统中,为了在一个目录中创建一个新文件,必须对该目录具有什么权限?
写入权限和执行权限
18.进程和线程有哪些区别以及Linux系统提供了哪些线程同步机制?
1.线程是进程内的独立执行实体和调度单元。
进程有独立的地址空间,线程没有;
线程是处理器调度的基本单位,但进程不是;
进程是资源分配和拥有的单位,线程只能和同一个进程内的线程共享进程的资源.
2.互斥量,读写锁,条件变量
19.在UNIX/Linux系统中可以认为操作系统用了三张表来描述一个打开的文件,哪三张表?
这三张表各自描述了文件的哪些属性?
它们之间是如何联系起来的?
1.文件描述符表,文件表,索引节点表
2.文件描述符表:
文件描述符标志,指向一个文件表项的指针。
文件表:
文件状态标志,文件读写偏移量,指向该文件索引节点表项的指针。
索引节点表:
文件属性,数据块位置,当前文件长度。
3.通过指针指向对应表项
20.在UNIX/Linux系统中/etc/shadow文件用来存储用户密码,所有用户都可以通过执行passwd命令(/usr/bin/passwd)修改自己的秘密(修改/etc/shadow文件),但非root的其他用户对/etc/shadow文件没有读写权限。
为什么所有用户都可以通过执行passwd命令修改自己的密码(修改/etc/shadow文件)
这是因为用户执行“/usr/bin/passwd”命令时,/usr/bin/passwd文件设置了setuid位,在执行此程序(/usr/bin/passwd)时,该用户所拥有的权限等同于文件“/usr/bin/passwd”的拥有者root的权限,而root用户拥有对/ect/passwd文件写的权限,因此普通用户可以通过/usr/bin/passwd来修改/etc/shadow文件的内容。
21.在UNIX系统下利用C语言编程,通过使用多线程和条件变量实现以下两个线程的同步工作:
线程A与线程B互斥地访问共享资源count(整形,全局变量,其初值为0)
线程A判断count的值是否大于0,如果大于0则执行count=count-1操作,循环往复
线程B执行count=count+1操作,循环往复
在main函数中首先创建线程A,再创建线程B
#include<
pthread.h>
stdio.h>
stdlib.h>
pthread_mutex_tmutex=PTHREAD_MUTEX_INITIALIZER;
/*初始化互斥锁*/
pthread_cond_tcond=PTHREAD_COND_INITIALIZER;
/*初始化条件变量*/
void*threadA(void*);
void*threadB(void*);
intcount=0;
intmain(void)
{
pthread_tA;
pthread_tB;
pthread_create(&
A,NULL,threadA,(void*)NULL);
/*创建进程A*/
B,NULL,threadB,(void*)NULL);
/*创建进程B*/
pthread_join(A,NULL);
/*等待进程A结束*/
pthread_join(B,NULL);
/*等待进程B结束*/
pthread_mutex_destroy(&
mutex);
pthread_cond_destroy(&
cond);
exit(0);
}
void*threadA(void*junk)
while
(1)
{
pthread_mutex_lock(&
/*锁住互斥量*/
if(count>
0){
count-=1;
}
pthread_cond_signal(&
/*条件改变,发送信号,通知t_b进程*/
pthread_mutex_unlock(&
/*解锁互斥量*/
printf("
%d\n"
count);
}
void*threadB(void*junk)
count+=1;
pthread_cond_wait(&
cond,&
/*解锁mutex,并等待cond改变*/
22.在LInux系统下利用C语言编程,实现一个程序,该程序功能类似于一个简单的shell程序,其具体要求为:
从标准输入读取输入的命令名/可执行文件名(要求用户输入的命令名和和可执行文件名为绝对路径,可以不考虑参数传递),以回车作为命令/可执行文件名输入的结束,然后创建子进程执行对应的命令/可执行文件,此时程序本身不再进行任何操作直到当前命令/可执行文件执行结束为止;
该程序一次只执行一条命令/可执行文件,不需要考虑输入输出重定向和管理,不需要考虑信号处理。
#include<
sys/types.h>
sys/wait.h>
unistd.h>
intmain(intargc,char*argv[]){
if(argc<
2){
Usage:
%scommand\n"
argv[0]);
return0;
}
pid_tpid;
intstatus;
if((pid=fork())<
0){
forkerror\n"
);
if(pid=0){
execl("
/bin/sh"
"
sh"
-c"
argv[1],(char*)0);
exit(0);
}else{
waitpid(pid,&
status,0);
return0;
}
23.在Linux系统下利用C语言编程,实现一个程序,该程序可以实现ls-l命令的功能。
(要求给出C语言代码或者给出关键代码并通过流程图及描述代码结构)。
#include"
apue.h"
dirent.h"
pwd.h"
grp.h"
time.h"
voidprint_error(char*errmsg)
printf("
ERROR:
%s\n"
errmsg);
char*getformattime(time_tt)
staticcharformattime[20];
structtm*lt;
lt=localtime(&
t);
chartmptime[24];
memset(tmptime,0,sizeof(tmptime));
strftime(tmptime,24,"
%Y-%m-%d%H:
%M:
%S"
lt);
strcpy(formattime,tmptime);
returnformattime;
char*getuserinfo(uid_tmy_uid)
charusername[100];
chargroupname[100];
staticcharuserinfo[200];
structpasswd*my_info;
structgroup*grp;
my_info=getpwuid(my_uid);
strcpy(username,my_info->
pw_name);
grp=getgrgid(my_info->
pw_gid);
if(!
grp){
strcpy(groupname,"
-"
strcpy(groupname,grp->
gr_name);
strcat(username,"
\t"
strcat(username,groupname);
strcpy(userinfo,username);
returnuserinfo;
char*getinfo(char*path)
staticcharstr[1000];
structstatinfo;
stat(path,&
info);
strcpy(str,"
----------"
if(S_ISDIR(info.st_mode)){
str[0]='
d'
;
}elseif(S_ISCHR(info.st_mode)){
c'
}elseif(S_ISBLK(info.st_mode)){
b'
}else{
-'
if(info.st_mode&
S_IRUSR){
str[1]='
r'
S_IWUSR){
str[2]='
w'
S_IXUSR){
str[3]='
x'
S_IRGRP){
str[4]='
S_IWGRP){
str[5]='
S_IXGRP){
str[6]='
S_IROTH){
str[7]='
S_IWOTH){
str[8]='
S_IXOTH){
str[9]='
chartmp[20];
strcat(str,"
"
sprintf(tmp,"
%ld"
info.st_nlink);
strcat(str,tmp);
strcat(str,getuserinfo(info.st_uid));
%20ld"
info.st_size);
strcat(str,getformattime(info.st_mtime));
returnstr;
intmain(intargc,char*argv[])
DIR*dp;
structdirent*dirp;
intmax_dir_length=sysconf(_PC_PATH_MAX);
chardir[max_dir_length];
if(argc!
=2){
charbuf[max_dir_length];
if(getcwd(buf,max_dir_length)){
strcpy(dir,buf);
}else{
print_error("
Diristoolongorsomethingerror!
"
strcpy(dir,argv[1]);
if((dp=opendir(dir))==NULL){
print_error("
Readdirfailed!
chartmp_dir[max_dir_length];
while((dirp=readdir(dp))!
=NULL){
if(strcmp(dirp->
d_name,"
.."
)&
&
strcmp(dirp->
."
)){
strcpy(tmp_dir,dir);
strcat(tmp_dir,"
/"
printf("
%s%s\n"
getinfo(strcat(tmp_dir,dirp->
d_name)),dirp->
d_name);
closedir(dp);