Linux第一阶段复习

1、简述如下目录的功能

/boot 与系统内核或启动有关的

/etc 存配置文件

/lib 存库文件

/bin 存命令

/home 所有普通用户的家目录

/root 管理员的家目录

2 写出15个熟悉的linux 命令,并说明其功能

答:

  • 文件类:cp rm mv(剪切/移动文件/重命名) cat(查看文件内容/合并文件到c.c文件(cat a.c b.c >c.c)) less(文本内容查看器,查看文件内容,但是文件内容不会显示到界面上) more(分屏显示文件内容) tail head vi/vim find(搜索指定文件) grep (在文件中过滤指定的字符串)touch (创建普通文件)mkdir(创建目录文件)

  • 进程类/监测工具:ps(显示与当前终端有关的进程信息-e显示系统中所有的进程信息-f显示更多的进程属性信息(全格式)-L显示进程中的线程ID)kill(9强制结束进程;-stop挂起进程)top (查看系统资源使用情况以及进程信息)jobs(显示当前终端任务)

  • 打包文件 tar (c:创建包文件f:指定目标为文件而不是设备v:显示详细过程t:显示x包中的内容:z:GNU版本新加的,使得tar有压缩和解压功能)

  • 打包过程:

    tar cvf mytar.tar a.txt mydir passwd
    
  • 解包过程

    tar xvf mytar.tar
    
  • gzip(对文件进行压缩或者解压)

  • gzip压缩:

  • gzip mytar.tar
    
  • gzip解压过程:

  • gzip -d mytar.tar.gz
    

3 linux 系统都有哪些类型的文件?每种类型用什么符号标识?

答:

  • 普通文件(-)
  • 目录文件(d)
  • 管道文件§
  • 链接文件(l)
  • c,b(设备文件)
  • s(套接字)

4 文件有哪些基本权限,分别对用的数值是多少?

答:

  • r (4)
  • w(2)
  • x(1)
  • -(0)

5 将一个名为file 的文件权限改成属主具有读写执行,同组人具有读写权限,其他人没有任何权限,写出命令:

答:chmod 760 file(属主权限+同组人权限+其他人权限)

6 将main.c 生成对应的可执行程序main, 中间一共经过几个步骤,分别是什么?并给出对应的gcc 编译命令。

答:四步骤

  • 预编译(gcc -E main.c -o main.i)
  • 编译(gcc -S main.i -o main.s)
  • 汇编(gcc -c main.s -o main.o)(生成EL格式)
  • 链接(gcc -o main main.o)

7 有三个文件 main.c ,add.c max.c 部分内容如下,请给出编译命令:

main.c如下

#include <stdio.h>
int add( int x, int y);
int max( int x, int y);
int main()
{
    int a = 2;
    int b = 3;
    printf("a+b=%d\n",add(a+b));
    printf("max=%d\n",max(a,b));
}

add.c 如下:

int add(int x, int y)
{
    return x + y;
}

max.c 如下:

int max( int x, int y)
{
    return x > y? x : y;
}

答:一步完成编译的命令为:

  • gcc -o main main.c add.c max.c(如果需要非标准库的东西还要加上-lx,x指的是外部标准库)

8 请写出makefile完成对第7题的自动编译。

答:

all : main
    main : main.o add.o max.o
        gcc -o main main.o add.o max.o
    main

9 调试使用什么工具?常用的调试命令有哪些?

  • gdb
    • p :查看变量值
  • s :进入将要执行的函数内部执行
  • set follow-fork-mode child :跟踪子进程调试
  • r :运行程序
  • n :单步执行
  • c :直接执行,适合跑多行程序(如果没有断点,直接执行完毕)
  • info break :查看所有标识断点的位置
  • display :持续显示某个变量的值(适用于循环之中)

10 什么是库?请简述共享库和静态库的区别.

答:在我们写代码的的时候经常会用到很多头文件,其实并不是用那些头文件,而是告诉系统,我写的写个代码需要几个函数,而这几个函数存在一个文件里,我已经把文件名也就是头文件告诉系统了,系统会自动的去一个目录下寻找有没有这个文件。而这个目录就是我们说的库。你可以简单的把它看成一个仓库,因为它会提供给你一些可以直接拿来用的变量、函数或类。
库实际上就是一段编译好的二进制代码,供系统在链接时链接调用。
一般存放在linux的usr/lib目录下。

  • 预先编译好函数的集合
  • 静态库.a
  • 程序在运行的时候才去链接动态库的代码,而多个程序共享的使用库中的代码,而我们的系统中,就默认采用的这种方式链接的。
    动态库是一个运行时库,需要在程序运行的时候把动态库也加载到内存中,并 这个加载的过程是操作系统操作的,操作系统会在特定的位置寻找该库,所以需要我们将动态库文件存在在指定目录下,才可运行。
  • 动态链接 *
    在执行文件开始之前外部的函数的机器码由系统从磁盘上对应的该动态库中复制一份到内存中,这个过程就是动态链接。
  • 共享库.so,
    程序在编译链接的时候,会把库中的代码链接复制到可执行文件中。程序在运行的时候将不再需要动态库。
    而这种在链接是所做的复制操作,就是静态链接。

11 如第7题代码,请将add.c 和max.c 中的方法生成到静态库libfoo.a中,写出生成库的命令:

答:

  • 首先编译成.o文件(gcc -c add.c/gcc -c max.c)
  • ar crv libfoo.a add.o max.o

12 如第7题代码,请将add.c 和max.c 中的方法生成到共享库libfoo.so中,写出生成库的命令

答:

  • gcc -shared -fPIC -o libfoo.so add.o max.o

13 查看可执行程序用到哪些共享库使用那个命令?

答:ldd+(可执行程序)

14 什么是进程?进程有那些基本状态?

答:一般来讲,进程定义为正在运行的程序的实例,简单地说,进程就是一个正在运行的程序。

程序 (program):通常为二进制,放置在储存媒体中 (如硬盘、光盘、软盘、磁带等), 为实体文件的型态存在;

进程 (process):程序被触发后,运行者的权限与属性、程序的程序码与所需数据等都会被加载内存中, 操作系统并给予这个内存内的单元一个识别码 (PID),可以说,进程就是一个正在运行中的程序。

进程不仅仅包含了正在运行的代码,还包括了运行代码所需要的各种资源。内核中使用进程控制块PCB(process control block)管理一个进程的数据结构,每个进程都有一个PCB。

15 程序与进程有什么区别?

答:进程和程序区别和联系表现在以下方面:
1)程序只是一组指令的有序集合,它本身没有任何运行的含义,它只是一个静态的实体。而进程则不同,它是程序在某个数据集上的执行。进程是一个动态的实体,它有自己的生命周期。它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而被撤消。反映了一个程序在一定的数据集上运行的全部动态过程。
2)进程和程序并不是一一对应的,一个程序执行在不同的数据集上就成为不同的进程,可以用进程控制块来唯一地标识每个进程。而这一点正是程序无法做到的,由于程序没有和数据产生直接的联系,既使是执行不同的数据的程序,他们的指令的集合依然是一样的,所以无法唯一地标识出这些运行于不同数据集上的程序。一般来说,一个进程肯定有一个与之对应的程序,而且只有一个。而一个程序有可能没有与之对应的进程(因为它没有执行),也有可能有多个进程与之对应(运行在几个不同的数据集上)。
3)进程还具有并发性和交往性,这也与程序的封闭性不同

16 linux系统中主函数有哪些参数,,写出主函数的完整形式,并说明各个形参的意义分别是什么?

答 :main(int argc,char* argv[],char*envp[]);

  • argc:参数个数
  • argv[]:参数数组
  • envp[]:环境变量

17 库函数(用户空间)和系统调用(内核中)有什么区别?

答:内核设计第三版(第五章)一旦系统调用就会产生中断,陷入内核

18 ipc机制有哪些?

答:管道 ,信号量,共享内存,消息队列,套接字

19 有名管道和无名管道的区别?

答:无名管道:管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道;只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程)。
单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中。

有名管道:不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存在于文件系统中。这样,即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过FIFO相互通信(能够访问该路径的进程以及FIFO的创建进程之间),因此,通过FIFO不相关的进程也能交换数据。值得注意的是,FIFO严格遵循先进先出(first in first out),对管道及FIFO的读总是从开始处返回数据,对它们的写则把数据添加到末尾。它们不支持诸如lseek()等文件定位操作。

20 什么是僵死进程?如何处理僵死进程

答:子进程先结束,父进程没有获取子进程的退出码(状态信息);解决方法:父进程调用wait或者 SIGCHLD(只在LINUX上有效)设置为忽略

21 如下代码一共产生多少个进程?

int main()
{
	fork()||fork();
}

答:3

22 如下程序分别输出多少个’a’?

int main()
{
    for( int i = 0; i < 2; i++)
    {
        fork();
        printf("a\n");
    }
}

答:6

23 如下程序分别输出多少个’a’?

int main()
{
    for( int i = 0; i < 2; i++)
    {
        fork();
        printf("a");
    }
}

答:8

24 什么是临界资源,什么是临界区?

答:

  • 临界资源:同一时刻只允许一个进程访问的资源
  • 临界区:访问临界资源的代码段

25 请说明信号量的pv操作分别代表什么意思?那个操作可能阻塞为什么?

答:

  • P阻塞
第一阶段复习考试题(编程题)

26 写程序,父进程复制产生子进程,在父子进程中循环打印7次字符串“parent",

在子进程中循环打印3次字符串"child",补全代码:(8分)

int main()
{
    char* s = NULL;
    int n = 0;
    pid_t pid = fork();
    
    
}

27 写程序使用open,read,write,close等系统调用,对文件a.txt进行复制生成b.txt (8分)

int main()
{
    int fdr = open("a.txt",O_RDONLY);
    int fdw = open("b.txt",O_WRONLY|O_CREAT,0600);
    if(fdr == -1|| fdw == -1){
        exit(0);
    }
    char buff[1024] = {0};
    int n = 0;
    while((n = read(fdr,buff,1024))>0){
        write(fdw,buff,n);
    }
    close(fdr);
    close(fdw);
    
}

28 写程序改变SIGINT信号的响应方式,使得程序在第一次收到信号时,打印信号的代号值,第二次收到信号时按默认方式结束程序。修改补全代码:(9分)

void sig_fun(int sig)
{
    printf("sig=%d\n",sig);
    signal(sig,SIG_DFL);//重置下一次非法结束时候的信号量响应方式
}
int main()
{
    signal(SIGINT,sig_fun);
	while(1)
    {
        printf("hello\n");
        sleep(1)
    }
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LredCoat

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值