操作系统(学习一)

本文详细介绍了Linux操作系统的学习,包括查看进程状态、内存使用、tar命令的参数,修改文件权限,常用Linux命令,以root权限运行程序,软链接与硬链接的区别,静态库与动态库的制作及使用,GDB调试命令,大小端概念,进程调度算法,内存管理(页表、缺页中断)等。此外,还讲解了如何创建和使用静态库、动态库,以及Linux下如何使用gcc编译生成.out、.o、.a、.so文件。
摘要由CSDN通过智能技术生成

问题

问题来自C++面试宝典

1. 查看进程运行状态的指令、查看内存使用情况的指令、tar解压文件的参数(后面部分有详细介绍)

ps -l | grep PID用来查看某PID进程的状态
free -m查看内存使用情况
③以下五个命令中必选一个:
-c: 建立压缩档案  -x:解压  -t:查看内容  -r:向压缩归档文件末尾追加文件  -u:更新原压缩包中的文件
以下几个参数是可选的:
-z:有gzip属性的  -j:有bz2属性的  -Z:有compress属性的  -v:显示所有过程  -O:将文件解开到标准输出
补充:查看进程运行状态、查看内存使用情况的指令均可以使用top指令

2. 修改文件权限

Linux是多用户系统,文件权限是防止系统被恶意篡改的途径之一。
Linux文件的基本权限有9个,分别是owner/group/others三种身份各自有自己的read/write/execute权限(读、写与执行)。

可以用ls -l 文件来查看该文件所属情况,例:-rw-r--r-- 1 root root 73 Mar 3 20:11 hello.c给出了hello.c文件的创建者,创建者归属的用户组,相应的还列出了文件大小、创建日期和时间、文件名。

修改权限的指令:chmod
每一个权限设置都可以用数值表示:r = 4, w = 2, x = 1,当这些值加在一起,总数就是用于指定的权限。例:设置用户可以读写,用户组只读,其他只读,则权限设置就是644。

	root@ubuntu:~# ls -l hello.c
	-rw-r--r-- 1 root root 73 Mar  3 20:11 hello.c
	root@ubuntu:~# chmod 644 hello.c
	root@ubuntu:~# ls -l hello.c
	-rw-r--r-- 1 root root 73 Mar  3 20:11 hello.c

可以看到同组的用户被限制掉写的权限。
补充:若使用chmod -R xyz,-R会进行递归的持续变更,即同此目录下的所有文件都会变更

3. 常用的Linux命令

  1. cd命令:用于切换当前目录
  2. ls命令:查看当前文件与目录
  3. grep命令:常用于分析一行的信息,若当中有我们需要的信息,就将该行显示出来,该命令通常与管道命令一起使用,用于对一些命令的输出进行筛选加工。
  4. cp命令:复制命令(后面部分有详细介绍)
  5. mv命令:移动文件或文件夹命令
  6. rm命令:删除文件或文件夹命令
  7. ps命令:查看进程情况
  8. kill命令:向进程发送终止信号
  9. tar命令:对文件进行打包,调用gzip或bzip对文件进行压缩或解压
  10. cat命令:查看文件内容,与less、more功能相似
  11. top命令:查看操作系统的信息,如进程、CPU占有率、内存信息等
  12. pwd命令:用于显示工作目录

4. 如何以root权限运行某个程序

sudo chown root app(文件名) 输入密码
sudo chmod u+s app(文件名)
输入上面两条指令后即可。

5. 软链接与硬链接的区别

从几个方面作答。

  1. 定义不同
     软链接又叫符号链接,这个文件包含了另一个文件的路径名。可以是任意文件或目录,可以链接不同文件系统的文件。
     硬链接就是一个文件的一个或多个文件名。把文件名和计算机文件系统使用的节点号链接起来。因此我们可以用多个文件名与同一个文件链接,这些文件名可以在同一目录或者不同目录。
  2. 限制不同
     硬链接只对已存在的文件进行创建,不能交叉文件系统进行硬链接的创建;
     软链接可对不存在的文件或目录创建软链接,可交叉文件系统;
  3. 创建方式不同
     硬链接不能对目录进行创建,只可对文件创建;
     软链接可对文件或目录创建;
  4. 影响不同
     删除一个硬链接并不影响其他有相同inode的文件。
     删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软链接被称为死链接(即dangling link,若被指向路径文件被重新创建,死链接可恢复成正常的软链接)。

6. 静态库和动态库怎么制作及使用,它们的区别

  1. 静态库的生成:
    gcc -c hello.c先 生成.o文件
    ar -cr libhello.a hello.o创建libhello.a静态库

    静态库的使用:
    gcc main.c -lhello -o sttaticLibrary
    main.c和libhello.a静态库链接,生成target执行文件;
    -lhello是我们生成的.a文件砍头去尾的写法,-L是指告诉gcc编译器先从-L指定的路径去找静态库,默认是从/usr/lib/或者/usr/local/lib/去找;
    staticLibrary是最后想生成的文件名

  2. 生成动态库的指令:
    gcc -shared -fPIC -o libhello.so hello.o
    -shared:制定生成动态库
    -fPIC:该选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关代码

    动态库的使用:
    gcc main.c -lhello -L ./ -o dynamicDepot
    -lhello是我们生成的.so文件砍头去尾的写法,-L是指告诉gcc编译器先从-L指定的路径去找动态库,默认是从/usr/lib/或者/usr/local/lib/去找;
    ./ 是当前路径的意思
    dynamicDepot是最后想生成的文件名

  3. 区别
    1. 速度:静态库代码装载的速度快,执行速度略比动态库快
    2. 内存:动态库更加节省内存,可执行文件体积比静态库小很多
    3. 加载时期:静态库在编译时加载,动态库在运行时加载
    4. 后缀名:生成的静态库链接,在Windows下以.lib为后缀,Linux下以.a为后缀;生成的动态库链接,在Windows下以.dll为后缀,Linux下以.so为后缀。

7. GDB常见的调试命令,什么是条件断点,多进程下如何调试

  1. GDB调试:gdb调试的是可执行文件,在gcc编译时加入如-g,告诉gcc在编译时加入调试信息,这样 gdb 才能调试这个被编译的文件gcc -g test.c -o test(后面部分有详细介绍)
    gdb test.out进入gdb调试
    GDB命令格式:

    1. quit:退出gdb,结束调试
    2. list/l:查看程序源代码
      list 5, 10:显示5-10行代码
      list test.c:5, 10:显示源文件5-10行的代码,在调试多个文件时使用
      list get_sum:显示get_sum函数周围的代码
      list test.c gei_sum:显示源文件test.c的get_sum函数周围的代码,调试多个文件时使用
    3. reverse-search:字符串用来从当前行向前查找第一个匹配的字符串
    4. run/start:程序开始执行
    5. help list/all:查看帮助信息
    6. break/b 行号:设置断点,一开始进入调试,初始只有一个断点在main函数
    7. watch条件表达式:条件表达式发生改变时程序就会停下来
    8. next/n:继续执行下一条语句,会把函数当做一条语句执行
    9. step:继续执行下一条语句,会跟踪进入函数,一次一条地执行函数内代码
      linux下gdb调试常用命令汇总
  2. 条件断点:break if条件,以条件表达式设置断点

  3. 多进程下如何调试:用set follow-fork-mode child调试子进程
             或者set follow-fork-mode parent父进程

8. 什么是大端小端,如何判断大小端

数据在内存中存放,有大端模式和小端模式。
小端模式(little-endian):低的有效字节存储在低的存储器地址。小端一般为主机字节序,常用的x86结构是小端模式,很多架构如ARM、DSP都为小端模式。
大端模式(big-endian):高的有效字节存储在低的存储器地址。大端为网络字节序,KEIL C51就是大端模式。
补充:有些ARM处理器可由硬件决定选择大端模式还是小端模式。

判断的话,之前的一篇文章里有整理过三种。

  1. 使用联合体进行判断
    ①联合体的各个成员都是公用内存
    ②联合体的成员不管是在哪个架构上默认都是从低地址存储的,这点非常重要。

    union endian{
         
    	char a;
    	int b;
    }test;
    
    int main()
    {
         
    	test.b = 0x87654321;
    	printf("0x%p\n", test.a );
    	return 0
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值