linux期末复习题库.docx
《linux期末复习题库.docx》由会员分享,可在线阅读,更多相关《linux期末复习题库.docx(21页珍藏版)》请在冰点文库上搜索。
linux期末复习题库
Linux编程技术知识要点
1.linux中把分区和目录对应的过程叫做挂载。
2.信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式。
3.用GCC编译过程可以被细分为四个阶段:
预处理,编译,汇编,连接。
4.编译有线程的文件要加-lpthread参数。
5.父进程等待子进程的结束,可以使用的函数是wait()和waitpid()。
6.linux主要有两个信号安装函数,分别是signal(),sigaction()
7.Linux操作系统内核由C和汇编编写完成。
8.使用gdb调试程序时,,next和step命令的作用?
next:
单步运行,不进入函数内部;setp单步运行,进入函数内部
9.目录/boot下存放linux操作系统启动时所要用到的程序
10.Linux系统的设备文件分为三类?
字符设备文件、块设备文件和网络设备文件
11.Linux中采用“一对一”的线程机制,也就是一个用户线程对应一个内核线程。
12.vim三种模式:
在命令模式下按下:
就进入了底线命令模式。
13.标准I/O提供了三种类型的缓冲,分别是?
全缓冲,行缓冲,不带缓冲
14.linux文件系统由四部分组成引导块、专用块、i节点表块和数据存储块,用于存放文件的控制信息。
15.一个完整的信号生命周期包含4个重要的事件,这4个重要事件分别是?
信号诞生信号在进程中注册信号在进程中注销信号处理函数执行完毕
16.互斥锁只有两种状态,即?
开锁和上锁
17.线程本身调用pthread_exit()函数可以退出线程。
18.向消息队列发送消息的函数是msgrcv()。
19.stat系统调用可以根据文件描述符来操作文件特性。
20.Valgrind包括很多工具,Memcheck是valgrind应用最广泛的工具,一个重量级的内存检查器,能够发现开发中绝大多数内存错误使用情况,Cachegrind是主要用来检查程序中缓存使用出现的问题。
21.信号发送函数中,setitimer()用于设置定时器,当计时时间到达时,向进程发送SIGALRM信号。
22.在标准IO库中,rewind函数作用?
将文件流指针指向文件起始位置
23.c语言中没有明确给定初值的全局变量和静态变量存放在哪儿?
未初始化数据区
24.函数geteuid()用于得到进程的?
用户有效UID
25.当一个线程的属性设置为分离状态,该线程结束时立即释放它所占有的系统资源。
26.以下哪种方式属于异常终止一个进程(D)
A从main函数返回。
B调用exit。
C最后一个线程从其启动例程返回。
D接到一个信号并终止。
27.下列命令哪个是创建线程私有数据命令(A)
Apthread_key_create()Bpthread_setspecific()
Cpthread_getspecific()Dpthread_key_delete();
28.下面哪种通信方式适用于不同机器之间的进程通信。
(D)
A.消息队列B.共享内存C.信号量D.套接字
29.创建或打开消息队列的函数为(A)
A.msgget()B.msgsnd()C.msgrcv()D.msgctl()
30.什么是进程?
进程资源由哪两部分组成?
进程是可并发执行的程序在某个数据集合上的一次计算活动,也是操作系统进行资源分配和调度的一个独立单位。
进程资源由内核空间资源(PCB控制块)和用户空间资源
31.linux中通过调用waitpid()函数得到进程的退出信息,该函数原型为
pid_twaitpid(pit_tpid,int*statloc,intoptions);当第一个参数pid取值为-1时,表示(A)
A等待任一子进程退出,相当于wait()。
B等待进程组ID与调用进程组ID相同的任一子进程。
C只等待进程ID等于PID的子进程。
D等待指定进程组中的进程,该进程组id等于pid的绝对值。
32.pid_tfork()返回值的意义?
若执行成功,父进程中将返回子进程(新创建的进程)的PID,类型为pid_t,
子进程将返回0,以区别父子进程
若执行失败,则在父进程中返回-1,错误原因存储在errno中
33.Linux环境中使用kill函数向进程或进程组发送信号。
Kill函数原型为
intkill(pid_tpid,intsigno);当第一个参数pid>0时,表示(A)
A发送信号给进程ID为pid的进程;
B发送信号给进程组ID和该进程相同的进程;
C发送信号给进程组内进程ID为pid的绝对值的进程;
D发送信号给系统的所有进程;
34.共享主存基本操作(A)将共享主存区映射到进程虚拟地址空间。
Ashmat()Bshmdt()Cshmctl()Dshmget()
35.修改消息队列状态信息的命令是(B)
Amsgsnd()Bmsgctl()Cmsgrcv()Dmsgget()
36.父进程调用wait()可能出现的三种情况?
(5分)。
1.当有子进程退出时wait返回子进程的pid并且获取到子进程的退出状态
2.当没有子进程退出时父进程将阻塞等待子进程退出
3.当没有子进程时,wait返回-1
37.在进程中,return和exit()的区别?
如果是在main函数中exit和return都是终止进程但是return会弹栈exit不会
如果是在函数中return返回到上级函数调用的位置,exit会终止进程
38.什么是孤儿进程?
谁负责回收孤儿进程的内核空间资源?
父进程先于子进程结束则子进程称为孤儿进程由init0接管并回收其内核资源
39.僵尸进程是什么?
如何消灭僵尸进程?
僵尸进程子进程结束但是父进程未回收其内核资源,可以通过调用wait()或waitpid()或者使其成为孤儿进程由操作系统回收其内核资源
40.简述进程对可靠信号和不可靠信号的处理过程。
不可靠信号不支持排队如果在进程屏蔽信号时给其发送多个不可靠信号,在取消屏蔽后只会接收到一个
可靠信号支持排队如果在进程屏蔽信号时发送多个信号,在取消屏蔽后会按照先后顺序接收到所有可靠信号
41.简单介绍一下信号的定义及其分类。
信号是一种软中断,用来通知进程发生了异步事件0~31分为不可靠信号32~63可靠信号
42.简单介绍一下匿名管道及其特点。
匿名管道用于实现有亲缘关系的进程之间相互通信
创建在内核空间,通信结束后消失
43.请解释一下有名管道和匿名管道的区别?
无名管道用于实现具有亲缘关系的进程间通信
有名管道用于实现非亲缘关系的进程间通信
有名管道是一个特殊的文件结束通信后不会内容消失但文件不消失
无名管道结束通信后消失
44.什么是线程?
进程和线程的区别?
线程是操作系统进程中能够并发执行的实体,是处理器调度和分派的基本单位。
区别:
1.调度、
在传统操作系统中进程是拥有资源和调度的基本单位
在引入了线程的操作系统中线程是操作系统分派和调度的基本单位
进程是拥有资源的基本单位
2.并发性
进程之间可以并发执行,在同一进程中的线程也可以并发执行
3.拥有资源
进程是拥有系统资源的基本单位
线程基本上不拥有系统资源,但也拥有其运行所必要的资源,在同一进程中的线程共享进程的地址空间
4.系统开销
创建或撤销进程时,系统都要为其创建和回收进程控制块(PCB)
进程的创建和撤销的开销远大于线程的开销
在进程切换时,涉及到当前进程CPU环境的保存以及新被调度运行进程的CPU环境的设置,而线程的切换则仅需保存和设置少量寄存器内容
进程切换的开销也是远大于线程的
45.Pleasedescribethedifferenceofsignal()andsigaction()inbrief
不同点
signal()
安装的信号不能向信号处理函数传递信息
sigaction()
可设置进程的信号掩码,返回设置之前的sigaction结构
安装的信号可以向信号处理函数传递信息
相同点
都可以为指定的信号设置信号处理函数
共用同一个内核函数do_sigaction()
编程:
重点了解以下实验的程序
实验二,第一题,第二题,第六题
实验一
1.创建文件file1,写入字符串“abcdefghijklmn”;
2.创建文件file2,写入字符串“ABCDEFGHIJKLMN”;
3.读取file1中的内容,写入file2,使file2中的字符串内容为“abcdefghijklmnABCDEFGHIJKLMN”
创建file1,file2文件
IO_open.c源码
/*************************************************************************
>FileName:
IO_open.c
>作者:
YJK
>Mail:
745506980@
>CreatedTime:
2019年09月08日星期日19时58分23秒
************************************************************************/
#include
#include
#include
#include
intmain(intargc,char*argv[])
{
intIO_OPEN,IO_OPEN_1;//文件描述符
intwrite_num1,write_num2=-1;
char*buf="abcdefghijklmn";
char*buf2="ABCDEFGHIJKLMN";
if(argc<3)
{
printf("ERROR!
number<3\n");
return-1;
}
IO_OPEN=open(argv[1],O_CREAT|O_RDWR,0755);
if(IO_OPEN==-1)
{
perror("open");
return-1;
}
IO_OPEN_1=open(argv[2],O_CREAT|O_RDWR,0755);
if(IO_OPEN_1==-1)
{
perror("open");
return-1;
}
write_num1=write(IO_OPEN,buf,strlen(buf));
write_num2=write(IO_OPEN_1,buf2,strlen(buf2));
close(IO_OPEN);
close(IO_OPEN_1);
return0;
}
实现file1中的字符串写入file2中
IO_file_rw.c源码
#include
#include
#include
intmain(intargc,char*argv[])
{
intfd,fd2=-1;
intrd_num,rd_num2,wt_num=-1;
charbuf[128]={0};
charbuf1[128]={0};
if(argc<3)
{
printf("ERROR!
\n");
return-1;
}
if((fd=open(argv[1],O_RDONLY))==-1)//以读写方式打开file1
{
perror("open");
return-1;
}
if((fd2=open(argv[2],O_RDWR))==-1)//打开file2
{
perror("open");
return-1;
}
rd_num=read(fd,buf,128);
rd_num2=read(fd2,buf1,128);
/*先将file2文件中的字符串向后移动rd_num(file中的字符串长度)个位置*/
lseek(fd2,rd_num,SEEK_SET);
write(fd2,buf1,rd_num2);
lseek(fd2,0,SEEK_SET);
write(fd2,buf,rd_num);
/*lseek(fd2,0,SEEK_SET);//先将file1中的字符串写入file2再将file2中的字符串追加到后面
write(fd2,buf,rd_num);
write(fd2,buf1,rd_num2);*/
close(fd2);
close(fd);
return0;
}
实验二
v编写代码,完成以下功能:
v1.创建新文件,该文件具有用户读写权限。
v2.采用dup/dup2/fcntl复制一个新的文件描述符,通过新文件描述符向文件写入“class_name”字符串;
v3.通过原有的文件描述符读取文件中的内容,并且打印显示;
IO_file.c文件源码
/************************************************************************
>FileName:
IO_file.c
>作者:
YJK
>Mail:
745506980@
>CreatedTime:
2019年10月10日星期四20时50分55秒
***********************************************************************/
#include
#include
#include
#include
#include
intmain(intargc,char*argv[])
{
intfd=-1;
intfd2=-1;//新的文件描述符
intwrnum,rdnum=0;
char*buf="移动一班--袁俊珂--1815925428\n";
charbuf1[128]={0};
umask(0);//修改umask值
fd=open(argv[1],O_CREAT|O_RDWR,0600);
if(fd==-1)
{
perror("open");
return-1;
}
//复制文件描述符
fd2=dup(fd);//选取未被使用的最小的文件描述法
//fd2=dup2(fd,5);//使用指定的文件描述符如果该文件描述符已被使用则关闭该文件描述符重新使用
//fd2=fcntl(fd,F_DUPFD,1);//实现文件描述符复制,选择大于等于1的未被使用的文件描述符
wrnum=write(fd2,buf,strlen(buf));//使用新的文件描述符写入字符串
if(wrnum==0)//如果写入失败
{
perror("write");
return-1;
}
//此时文件指针位于文件末尾
lseek(fd,0,SEEK_SET);//将文件指针指向文件开始
rdnum=read(fd,buf1,128);//使用老的文件描述符将文件中的信息读取到buf1中
if(rdnum==0)
{
perror("read");
return-1;
}
printf("%s",buf1);//打印出读取的字符串
close(fd);
close(fd2);
return0;
}
v编写程序完成以下功能:
v1.递归遍历/home目录,打印出所有文件和子目录名称及节点号。
v2.判断文件类型,如果是子目录,继续进行递归遍历,直到遍历完所有子目录为止。
IO_dirread.c源码
/************************************************************************
>FileName:
IO_dirread.c
>作者:
YJK
>Mail:
745506980@
>CreatedTime:
2019年10月13日星期日20时40分56秒
***********************************************************************/
#include
#include
#include
#include
#include
#include
intmain(intargc,char*argv[])
{
intdir_read(constchar*str);
dir_read(argv[1]);
return0;
}
intdir_read(constchar*str)
{
structstatbuf;
structdirent*dirp=NULL;
DIR*dir=NULL;
charBUF[512]={0};
if((dir=opendir(str))==NULL)
{
perror("opendir");
return-1;
}
while((dirp=readdir(dir))!
=NULL)
{
sprintf(BUF,"%s%s%s",str,"/",dirp->d_name);//获取目录的绝对路径
if(dirp->d_name[0]=='.')//跳过隐藏文件
continue;
if(stat(BUF,&buf)==-1)//需要使用绝对路径
{
perror("stat");
return-1;
}
if(S_ISDIR(buf.st_mode))//如果当前文件为目录,则递归查看其子目录
{
printf("%s%ld\n",BUF,dirp->d_ino);
dir_read(BUF);
}
else
{
printf("%s%ld\n",dirp->d_name,dirp->d_ino);
}
}
closedir(dir);
}
实验三,第二题,第三题
实验三
v创建子进程
v1.在子进程中打开文件file1,写入自己的“班级_姓名_学号”,
v2.父进程读取file1中的内容,并且打印显示。
v3.在父进程中获取已经结束的子进程的状态信息,打印该信息,并且打印结束的子进程的进程号。
/************************************************************************
>FileName:
IO_ptest1.c
>作者:
YJK
>Mail:
745506980@
>CreatedTime:
2019年10月17日星期四20时56分57秒
***********************************************************************/
#include
#include
#include
#include
#include
#include
#include
#include
intmain(intargc,char*argv[])
{
intfd,fd2=-1;
inti;
pid_tpid,pid_wait=-1;
intstatus;
char*buf="移动一班-袁俊珂-1815925428";
charBUF[128]={0};
if((pid=fork())==-1)
{
perror("fork");
exit(EXIT_FAILURE);
}
if(pid==0)
{
if((fd=open("myfile",O_CREAT|O_RDWR,0777))==-1)//在子进程中打开文件
{
perror("open");
exit(EXIT_FAILURE);
}
if(write(fd,buf,strlen(buf))==-1)
{
perror("write");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
else
{
pid_wait=wait(&status);//使父进程处于阻塞状态
if((WIFEXITED(status)))//判断子进程是否正常终止
{
printf("normalexit,returnvalue:
%d\n",WEXITSTATUS(status));
}
printf("childPID:
%d\n",pid_wait);
if((fd=open("myfile",O_RDONLY))==-1)
{
perror("parentopen");
exit(EXIT_FAILURE);
}
if(read(fd,BUF,128)==-1)//读取文件
{
perror("read");
exit(EXIT_FAILURE);
}
printf("readmyfile:
%s\n",BUF);
close(fd);
exit(EXIT_SUCCESS);
}
}
实验四,第三题
1.编写程序实现以下功能:
利用有名管道文件实现进程间通信,要求
写进程向有名管道文件写入10次“helloworld”;
读进程读取有名管道文件中的内容,并依次打印。
创建有名管道源码
/************************************************************************
>FileName:
IO_fifo.c
>作者:
YJK
>Mail:
745506980@
>CreatedTime:
2019年10月27日星期日