gcc与g++区别(补充了解):
比如有两个文件:main.c,mainc++.cpp(分别用C语言和C语言写的)如果要用gcc编译呢?
gcc -o mainc main.c
gcc -o mainc mainc++.cpp -lstdc++ 指明用c++的标准库;
区别一:
gcc默认只链接C库,并不会链接C++的库;g++会默认链接c++标准库.
区别二:
gcc编译.c文件,则按照C语言的方式编译;gcc如果编译.cpp文件,则按照c++的方式编译;
g++不管是c文件还是cpp文件,都是按照c++的方式进行编译;即g++不管文件后缀,直接按照c++的语法规则处理
问题:如果gcc要按照c++方式编译呢?需要指定库,例如:
gcc -o test test.cpp -lstdc++ 指定库
为什么是补充了解呢?就是正常使用就是gcc编译c文件,g++编译c++文件;
进程管理命令:
进程的概念
进程:运行中的程序(过程,动态)
程序:存储在磁盘上的二进制可执行文件;(静态)
操作系统是通过管理进程,让进程运行来完成用户的任务的;
PCB:进程控制块,记录的是进程的相关属性信息;数据结构
PID:是操作系统对进程的标识;唯一的;
简而言之, 程序:指令+数据; 进程:运行中的程序,也就是说,程序是存储在磁盘上的二进制可执行文件,而进程是内存上的,是运行中的程序(过程);
操作系统是通过管理进程,让进程运行来完成用户的任务的;
操作系统对于进程的描述:PCB(进程控制块,进程描述符),记录一个进程执行过程中的相关的属性数据;PID是操作系统对进程的标识,每一个进程的PID都是不同的(唯一性);
为了描述控制进程的运行,系统中存放进程的管理和控制信息的数据结构称为进程控制块(PCB Process Control Block),它是进程实体的一部分,是操作系统中最重要的记录性数据结构。它是进程管理和控制的最重要的数据结构,每一个进程均有一个PCB,在创建进程时,建立PCB,伴随进程运行的全过程,直到进程撤消而撤消。
(操作系统精髓与设计原理43页) 进程的组成;
(操作系统精髓与设计原理74页) PCB进程控制块结构;
补充:僵死进程:进程实体释放与PCB的释放有一个时间差(PCB的释放是需要一定条件的),进程实体被释放,但是PCB没有释放.
(1)ps 默认显示与当前终端有关的进程信息;
参数:-e -f -L
-f:显示更多的进程属性信息;
-e:显示系统信息;
-L:显示进程中的线程的ID;
ps -ef |grep ...
(2)pstree
以树状图形显示进程之间的关系;
(3)kill
结束或者挂起一个进程;
语法:
kill PID
-9 强制结束进程;(kill -9 PID);
kill -STOP PID:挂起一个进程
1)前后台
2)如何启动一个进程:
路径+可执行文件名
路径+可执行文件名 &(将进程放到后台去运行)
(4)jobs
显示当前终端的任务,显示后台执行的或者挂起的任务;
显示的结果分别是:
任务号 任务的状态 任务的名称;
jobs -l:显示详细内容;
(5)pkill
结束一组同名的进程,即结束一组CMD相同的进程;
(6)fg bg
将后台运行的或者挂起的进程挪到前台执行:fg %任务号
将挂起的进程唤醒到后台去执行:bg %任务号
(7)top
查看系统使用情况以及进程信息;
同Windows的任务管理器
用户管理命令:
(1)系统存储用户信息的位置:
/etc/passwd:存储用户的基本信息
UID:用户ID GID:组ID;
(2)系统存储组信息的位置:
/etc/group
(3)系统存储用户密码信息的位置:
/etc/shadow
(2)添加用户
使用命令添加新用户:useradd newname
桌面添加:右键:设置:用户,解锁,添加用户(Ubuntu建议用图形化界面添加用户)
(3)修改密码
先转成管理员 sudo su
passwd 用户名
exit
(4)删除用户
userdel 用户名(默认仅仅删除用户,不删除家目录,不删除家目录中的文件 ,比如/home/stu 不要删除)
注意,Ubuntu可以使用该命令删除用户,但是必须保证该用户没有登录,比如关机之后随便进入一个用户,然后转成管理员,那么就可以删除的用户.
userdel -r 用户名(删除家目录底下的所有文件)(一般不建议删除此文件)
文件压缩与解压命令:
(1)tar 打包或解包
tar 将文件打包
tar cvf xxxx.tar(打包好的名字) 需要打包的所有文件名
各参数的意义如下:
c:创建包文件
f:指定目标为文件而不是设备;
v:显示详细过程;
t:显示包中的内容而不释放;
x:释放包中的内容
z:GNU版本新加的,使得tar有压缩和解压的功能;
解包:
tar xvf xxx.tar(需要解包的名字)
(2)gzip 压缩或者解压
压缩:gzip 打包的名字
gzip my.tar (后缀名为.tar.gz)
解压:gzip -d xxx.tar.gz
打包--压缩--解压--解包
一步解压之后:打包--压缩---一步解压
(3)tar一步解压(重点)
GNU之后tar命令:
可解压两种格式:tgz tar.gz
tar zxf xxx.tar.gz
tar zxf xxx.tgz
(新的系统x也可以一步解压)
常见面试题目:
(1)问题:g++与 gcc 的区别, g++能编译.c 文件吗? gcc 能编译.cpp 文件吗?
考点: 对 gcc 和 g++工具的使用
- gcc 现在是 GNU提供的一些编译器工具的集合(Gnu Compiler Collection),以
前是GNU组织提供的 c 编译器(Gnu C Compiler)。 g是 c编译器编译器。 - gcc 可以编译.c 和.cpp 的源文件对.c 按 c 语言语法规则处理, .cpp 自动按
c语法规则处理,但默认不链接相应的 c库,需要手动指定链接的库名"-lstdc++"
例如:gcc -o test test.cpp -lstdc++
- g可以编译.c 和.cpp 的源文件,但是都按 c的语法规则来处理。
(2)gdb常用命令(答案略)
(3)问题:Linux 调试,程序断点实现思路?
解答:
linux 提供了系统调用 ptrace(),它可以提供一个进程跟踪控制另一个进程的方法,并可以检查和改变被跟踪进程内存和寄存器里的数据,可以用它来实现断点调试的功能。
原理是 attach 在正运行的进程使其停止,然后读取进程的指令寄存器内容所指向的指令,备份后替换成目标指令,再使其继续执行,此时被追踪进程就会执行我们替换的指令,运行完成注入的指令后,再恢复原进程的指令寄存器的值, 从而达到改变运行原程序逻辑的目的。
参考博客:
Linux Ptrace 详解-CSDN博客
Linux Hook 笔记 - 有价值炮灰 - 博客园
(4)问题:现有从网上下载的redis安装文件:redis-6.0.9.tar.gz 现在如何对其进行解压释放出源文件,请给出操作命令?
解答:
tar zxf redis-6.0.9.tar.gz
(5)问题:Linux 的版本号是多少, gcc 的版本号是多少
解答:
使用命令 uname 可以查看 Linux 的版本, 使用 gcc -v 可以查看 gcc 版本。
(6).vi/vim的基本命令
问题:vi 的基本命令使用操作
解答:
- 三种模式:命令模式、插入模式、末行模式
- 命令模式转插入模式: i a o , I A O
- 命令模式下几个快捷操作: nyy 复制 n 行, ndd 删除/剪切 n 行 p 粘贴 等等
- 末行模式几种操作: :wq 保持退出 :w 只保存 :q 只退出 :q!不保持退出 等
(7)问题:查看系统某个日志文件 ,使用哪个命令最合适?
解答:tail命令
(8)问题:程序和进程的区别?
解答:
程序:存储在磁盘上的二进制可执行文件。
进程: 是一个正在运行的程序,它是动态的,而程序是一个静态的文件,进程