767-Linux高频考点梳理(1)

g++与 gcc 的区别,g++能编译.c 文件吗?gcc 能编译.cpp 文件吗?

1、gcc 现在是 gnu 提供的一些编译器工具的集合(Gnu Compiler Collection),以前是gnu 组织提供的 c 编译器(Gnu C Compiler)。g++是 c++编译器编译器。
2、 gcc 可以编译.c 和.cpp 的源文件对*.c 按 c 语言语法规则处理,*.cpp 自动按 c++语法规则处理,但默认不链接相应的 c++库,需要手动指定链接的库名"-lstdc++"
3、 g++可以编译.c 和.cpp 的源文件,但是都按 c++的语法规则来处理。

gdb 常用的调试命令都有哪些?

  1. l 显示代码
  2. b +行号 加断点
  3. info break 显示断点信息
  4. delete 删除断点
  5. r 启动程序
  6. n 单步执行,下一步
  7. c 继续执行
  8. s 进入函数
  9. finish 跳出函数
  10. p 打印
  11. q 退出调试
  12. bt 显示函数调用栈
  13. 多进程中,跟踪子进程:set follow-fork-mode child
  14. 多线程中,A 查看线程信息 info threads B 切换到指定线程 thread id

fcntl 方法可以做什么?

(1) 复制文件描述符
(2) 设置文件描述符标志位
(3) 设置文件描述符对应的文件状态标志,如阻塞非阻塞等。
(4) 设置与异步 io 有关的属性信息
(5) 设置文件锁

fork 以后,父进程打开的文件指针位置在子进程里面是否一样?

在 fork 之前打开的文件,在复制进程后,父子进程共享文件偏移量,所以文件指针在相同位置。

Linux 调试,程序断点实现思路?

linux 提供了系统调用 ptrace(),它可以提供一个进程跟踪控制另一个进程的方法,并可以检查和改变被跟踪进程内存和寄存器里的数据,可以用它来实现断点调试的功能。原理是 attach 在正运行的进程使其停止,然后读取进程的指令寄存器内容所指向的指令,备份后替换成目标指令,再使其继续执行,此时被追踪进程就会执行我们替换的指令,运行完成注入的指令后,再恢复原进程的指令寄存器的值,从而达到改变运行原程序逻辑的目的。

vi 的基本命令使用操作

(1) 三种模式:命令模式、插入模式、末行模式
(2) 命令模式转插入模式: i a o , I A O
(3) 命令模式下几个快捷操作:nyy 复制 n 行,ndd 删除/剪切 n 行 p 粘贴 等等
(4) 末行模式几种操作: :wq 保持退出 :w 只保存 :q 只退出 :q!不保持退出 等

程序和进程的区别?

程序:存储在磁盘上的二进制可执行文件。
进程:是一个正在运行的程序,它是动态的,而程序是一个静态的文件,进程是程序的一次实例化,一个程序可程执行多次生成多个进程

僵死进程概念及处理方式?

子进程先于父进程结束,父进程没有调用 wait 获取子进程的退出码,此时,子进程变成僵死进程。
解决办法:父进程调用 wait 获取退出码,或 父进程先结束,让 init 进程接管子进程。

进程与线程的区别?

进程是一个正在运行的程序,是系统进行资源分配的基本单位。
线程是进程内部的一条执行路径,是系统进行调度的基本单位。
在操作系统中将线程的实现分了三类: 用户级线程 内核级线程 混合方式
在这里插入图片描述

多线程的坏处?

引入多线程后,系统的执行路径变成了多条,并且这多条执行路径在并发运行。那么首先程序的执行具有一定的不确定性,每次执行结果可能都会不同,因为程序交替执行的顺序和时机不同了。其次,使得某些资源的访问出现了竞争,问题变得困难,需要资源进行同步。这会使得程序的可靠性和稳定性降低。

fork 复制过程?

(1) 分配 pid
(2) 分配进程描述符也就是 pcb,同时会分配好内核栈
(3) 复制进程实体,即:打开的文件,工作目录、信号信息、进程地址空间,等等
(4) 用父进程内核栈上存放的现场信息,初始化为子进程的现场信息,并将 eax 置 0
(5) 将父进程时间片分子进程一半,设置进程状态为就绪。

文件描述符对于服务器来说有什么作用?

在 linux 中,一切皆文件。打开磁盘上的普通文件,管道文件,或者建立一个套接字连接,都需要用到一个文件描述符来标识,对于服务器来说,剩余文件描述符的多少也可以理解为能和客户端建立的连接数。

操作系统中所说的 pv 操作是什么?

pv 操作都是对信号量而言的
p 是对信号量的值进行原子减一,代表获取资源,当信号量的值为 0 时,p 操作会阻塞,意味着资源不可用。
v 操作是对信号量的值进行原子加一,代表释放资源,v 操作从不阻塞。

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

临界资源:同一时刻只允许一个进程(线程)访问的资源,叫临界资源。
临界区:访问临界资源的代码段叫临界区。

全双工和半双工通信区别?

半双工:数据可以从 A 到 B 发送,也可以从 B 到 A,但某一刻,只能是一个方向。
全双工: 数据在任一刻,可以在两个方向同时进程,即 A 到 B,和 B 到 A。

写入管道的数据会乱序吗?

管道是个流式的,依次写入,依次顺序读取。不会乱序,但多线程中如果两个线程同时写入,数据可能会交替在一起。

管道为什么是半双工的?

由于 Linux 一个命令只完成一个功能,所以一个复杂点的任务需要好几个进程协同完成,第一个进程处理的结果需要交给第二个进程,然后依次交给第三个,等等,像流水线完成某个商品的生产一样,这个过程只需要数据单向往下传输,所以设计的时候做成了半双工。当然也可以使用管道实现全双工通讯,需要使用两个管道,不过比较麻烦。
如果需要使用全双工通讯建议使用双向管道,也就是 socketpair,它虽然名字叫双向管道,可是并不是管道,而是两个打开的套接字。

Makefile 文件作用

管理工程,实现自动化编译。

fork 的写时拷贝及作用?

在进行 fork 复制进程时,并不马上进行父进程的地址空间的完全拷贝。而是使用了写时拷贝(Copy-On-Write)技术,即就是让父进程和子进程共享父进程的页面,当父进程或子进程中任意一个进程试图修改某个页面时,再将其拷贝一份给子进程。这样可以延迟页面拷贝,提高 fork 复制的效率,。另外,通常 Linux 中的新进程都是通过fork+exec 实现的,如果 fork 后需要执行 exec 那么直接就不需要拷贝了。

Linux 查看进程堆栈命令?

pstack + pid

Linux 进程核心转储文件的调试 coredump?

一般调试程序常用的就是 gdb 工具,有时候程序太大,运行时突然崩掉,不方便跟踪。此时可以使用 core 文件进行定位运行时的错误,但如果是逻辑上的错误,运行结果不正确,程序也没有崩溃是不能使用 core 文件进行定位的。

(1)设置 core 文件大小,默认为 0,即程序运行出错不生成 core 文件,也就无法调试。
开启命令为 ulimit -c size ,size 为设置 core 文件的大小,当 core 文件大小超过该值时,
不生成 core 文件。也可设置为 ulimit -c unlimited 不限制大小。
(2)运行要调试的程序,程序错误崩溃后,自动生成 core 文件,如 core.5463,后缀为进
程 pid。
(3)假设程序名字叫 main, 则执行 gdb main core.5463
(4) gdb bt 可以看到函数调用栈信息,即可看到出错位置

如何查看共享内存?

ipcs -m 查看系统中共享内存
ipcrm -m shmid 删除共享内存
ipcs -s 查看 信号量
ipcs -q 查看消息队列

守护进程实现方式?

守护进程也称精灵进程(daemon)是生存期较长的一种进程。它们常常在系统自举时启动,仅在系统关闭时才终止。并且它们没有控制终端,在后台运行。
守护进程编程流程:
(1)在父进程中执行 fork 并 exit 退出父进程; (2)在子进程中调用 setsid 创建新的会话;
(3)再一次执行 fork,退出父进程(可以不做)
(4)在子进程中调用 chdir 函数,让根目录 ”/” 成为子进程的工作目录;
(5)在子进程中调用 umask 函数,设置进程的 umask 为 0; (6)在子进程中关闭不需要的文件描述符

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

林林林ZEYU

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

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

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

打赏作者

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

抵扣说明:

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

余额充值