Linux操作系统期末练习题lym 下载本文

stat根据路径获得文件元数据信息

fstat根据文件描述符获得文件元数据信息

前两者如果遇到符号链接文件则会一直引用至非符号链接文件 lstat获得符号链接文件本身的文件元数据信息 12.dup和dup2的区别和联系

联系:dup与dup2都用来将新文件描述符指向原来文件描述符指向的打开文件描述。 区别:dup返回的新文件描述符为最小可用的文件描述符,dup2返回的新文件描述符可以通过第二个参数指定。

13.硬链接和符号链接的区别 (1)命令

ln 原文件硬链接文件(不能对目录创建硬链接) ln –s 原文件/目录符号链接文件

(2)是否新增文件:硬链接不增文件,符号链接增加文件。 (3)删除原文件/目录

硬链接:对应i节点链接数-1。 符号链接:符号链接文件失效。 (4)删除链接文件

删除硬链接文件,使对应i节点的链接数-1。 删除符号链接文件,对原文件/目录无任何影响

(5)是否跨文件系统:硬链接不可以,符号链接可以

14.fork与vfork区别?

(1)fork创建的子进程复制父进程的整个地址空间,vfork不创建这一副本,子进程借用父进程的地址空间,直到其调用exec族函数或终止;

(2)fork创建的子进程和父进程相互独立地运行,而vfork创建子进程后挂起父进程,直到子进程终止或调用exec族函数。

使用kill发送信号时,发送方进程应具有相应的权限:

接受和发送进程的所有者相同,发送进程的所有者是超级用户。 15.阅读以下代码,若execlp调用成功的话,“Done!”会打印输出吗?为什么? #include int main() { printf(“Running ps with execlp\\n”); execlp(“ps”,”ps”,”-af”,0); printf(“Done!\\n”); exit(0); }

不会输出“Done!”。 原因:

执行execlp(“ps”,”ps”,”-af”,0)调用成功后,当前进程的地址空间被新的程序ps所替代,将执行“ps -af”

16.试写出下列程序段的运行结果,并解释原因 int x=0,int y=0;

void thread1(void) { printf(“This is pthread1.the sentence 1\\n”); y=7; sleep(1); printf(“This is pthread1.the sentence 2\\n”); x=x+y; }

void thread2(void) { printf(“This is pthread1.the sentence 1\\n”); x=4; sleep(1); printf(“This is pthread1.the sentence 1\\n”); y=8+y; }

void main(void) { pthread_t id1,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); }

答案:

This is pthread1.the sentense 1 This is pthread2.the sentense 1 This is pthread1.the sentense 2 This is pthread2.the sentense 2 x=11,y=15 原因:

(1)线程1先运行,线程2后运行。

线程1执行sleep(1);后阻塞,线程2继续执行,线程2执行到sleep(1);时线程2阻塞,线程1阻塞结束继续执行,线程1执行结束后线程继续执行到结束。 (2)线程1和线程2共享进程的数据段,因此共享变量x,y。

17.进程间通信的六种方式是什么?简述他们的通信原理? (1)信号:用于通知接收进程有某种事件发生。

(2)管道:连接一个进程的输出至另一个进程的输入的一种方法。 (3)信号量:一个计数器,用来记录对某个资源的使用情况。 (4)共享内存:允许多个进程访问同一块内存空间。

(5)消息队列:消息的链表,链表中每个节点包括消息类型和正文两部分。

(6)套接字:在网络上主机间进程进行通信的方式。 18.PIPE与FIFO的区别与联系

PIPE为未命名管道,FIFO为命名管道。

联系:PIPE和FIFO都是单向传输,一端为读,另一端为写。 区别:PIPE只能在有亲缘关系的进程中使用,如父子进程;

FIFO有名字,所以只要知道该名字,无关进程之间也可以使用。 19.书名产生信号的几种方式?

(1)用户操作。如键盘操作Ctrl-C,最终使得内核产生信号SIGINT。 (2)进程执行出错。如浮点数溢出,内核也会产生信号。

(3)进程执行某个系统调用。如调用kill向某个进程或进程组发送信号。 20.说明信号传递的过程。 (1)生成(generating)。内核要更新目标进程的数据结构,表示一个新的信号已经被发送给此进程。此时,进程并没有对信号做出任何响应。 (2)传递(delivery)。强迫目标进程对信号做出响应。 四、编程题

1.向文件f1中写入“hello world!”,然后再将f1中的内容读出并显示在屏幕上。(注意必要的错误判断) #include #include #include int main() { int fd; char buf1[13]={\ char buf2[12]; int num; fd = open( \ if(fd==-1) {

perror(\ exit(1); } num=write(fd,buf1,sizeof(buf1)-1); if(num!=(sizeof(buf1)-1))

printf(\ lseek(fd,0,SEEK_SET); num=read(fd,buf2,12); if(num!=12) printf(\ write(1,buf2,12); close(fd); }

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

#include #include #include int main() { int fd; char buf1[11]={\ char buf2[10]; int num; fd = open( \ if(fd==-1) {

perror(\ exit(1); } num=write(fd,buf1,sizeof(buf1)-1); if(num!=(sizeof(buf1)-1)) printf(\ lseek(fd,4,SEEK_SET); num=read(fd,buf2,6); if(num!=6) printf(\ write(1,buf2,6); close(fd); }

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

#include #include #include int main() { int fd; char buf1[17]={\ char buf2[8]; int num; fd = open( \ if(fd==-1) {

perror(\ exit(1); } num=write(fd,buf1,sizeof(buf1)-1); if(num!=(sizeof(buf1)-1))