2.1 Linux中查看进程运行状态的指令,查看内存使用情况的指令,tar解压文件的参数
- 查看进程运行状态的指令:ps命令。ps-aux | grep PID ,用来查看某PID 进程状态。
- 查看内存使用情况的指令:free命令。free-m ,命令查看内存使用情况。
- tar解压文件的参数 :五个命令中必选一个
- -c 建立压缩文档
- -x 解压
- -t 查看内容
- -r 向压缩归档文件末尾追加文件
- -u 更新源压缩包中的文件
2.2 文件权限怎么修改
- Linux文件的基本权限就有9个,分别是owner/group/others三种身份各自有自己的read/write/execute权限
- 修改权限指令:chmod。 chmod [-R] xyz 文件或者目录
- xyz:就是数字类型的权限属性,为rwx属性数值的相加。
- -R:进行递归的持续变更,亦即连同此目录下的所有文件都会变更。
2.3 说说常用的Linux命令
- cd命令:用于切换当前目录
- ls命令:查看当前文件与目录
- grep命令:用于分析一行的信息,若当中有我们需要的信息,就将该行显示出来,该命令通常与管道命令一起使用,用于对一些命令的输出进行筛选加工。
- cp命令:复制命令
- mv命令:移动文件或文件夹命令
- rm命令:删除文件或文件夹命令
- ps命令:查看进程情况
- kill命令:向进程发送终止信号
- tar命令:对文件进行打包,调用gzip或bzip对文件进行压缩或解压缩
- cat命令:查看文件内容, 与less,more功能相似
- top命令:可以查看操作系统的信息,如进程,CPU占用率,内存信息等
- pwd命令:命令用于显示工作目录。
2.4 说说如何以root权限运行某个程序
- sudo chown root app(文件名)
- sudo chown u+s app(文件名)
2.5 说说软连接与硬链接的区别
-
定义不同:
- 软连接又叫符号链接,这个文件包含了另一个文件的路径名,可以是任意文件或目录,可以连接不同文件系统的文件。
- 硬链接就是一个文件的一个或多个文件名。把文件名和计算机文件系统使用的节点号连接起来,因此我们可以使用多个文件名与同一个文件进行链接,这些文件名可以在同一个目录或不同的目录。
-
限制不同:
- 硬链接只能对已存在的文件进行创建,不能交叉文件系统进行硬连接的创建。
- 软连接可对不存在文件或目录创建软连接,可交叉文件系统
-
创建方式不同
- 硬链接不能对目录进行创建,只可对文件进行创建
- 软连接可对文件或者目录创建
-
影响不同:
- 删除一个硬链接文件并不影响其他有相同inode号的文件。
- 删除软连接并不影响被指向的文件,但若被指向的文件被删除,则相关软连接被称为死链接。但若被指向路径文件被重新创建 死链接可被恢复为正常的软连接。
2.6 说说静态库和动态库怎么制作及如何使用,区别是什么?
-
区别
- 静态库代码装载的速度快,执行速度略比动态库快。
- 动态库更加节省内存,可执行文件体积比静态库小很多。
- 静态库是在编译时加载,动态库是在运行时加载
- 生成的静态链接库,Windows下以.lib为后缀,Linux下以.a为后缀。
- 生成的动态链接库,Windows下以.dll为后缀,Linux下以.so为后缀。
-
静态库的制作及使用
gcc hello.c -c //这样就生成hello.o目标文件
ar rcs libhello.a hello.o//生成libhello.a静态库
gcc main.c -lhello -o staticLibrary//main.c和hello静态库链接,生成staticLibrary执行文件
/*
main.c: 是指main主函数
-lhello: 是我们生成的.a 文件砍头去尾(lib不要 .a也不要)前面加-l
-L: 是指告诉gcc编译器先从-L指定的路径去找静态库,默认是从/usr/lib/ 或者 /usr/local/lib/ 去找。
./: 是指当前路径的意思
staticLibrary: 是最后想生成的文件名(这里可随意起名字)
*/
- 动态库的制作及使用
gcc -shared -fpic hello.c -o libhello.so
-shared 指定生成动态库
-fpic :fPIC选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码。
gcc main.c -lhello -L ./ -o dynamicDepot
/*
main.c: 是指main主函数
-lhello: 是我们生成的.so 文件砍头去尾(lib不要 .so也不要)前面加-l
-L: 是指告诉gcc编译器先从-L指定的路径去找静态库,默认是从/usr/lib/ 或者 /usr/local/lib/ 去找。
./: 是指当前路径的意思
dynamicDepot: 是最后想生成的文件名(这里可随意起名字)
*/
2.7 简述GDB常见的调试命令,什么是条件断点,多进程下如何调试。
-
GDB调试:gdb调试的是可执行文件,在gcc编译时加入 -g ,告诉gcc在编译时加入调试信息,这样gdb才能调试这个被编译的文件
-
GDB命令格式:
- quit:退出gdb,结束调试
- list:查看程序源代码
- reverse-search:字符串用来从当前行向前查找第一个匹配的字符串
- run:程序开始执行
- help list/all :查看帮助信息
- break:设置断点
- watch 条件表达式:条件表达式发生改变时程序就会停下来
- next:继续执行下一条语句,会把函数当作一条语句执行
- step:继续执行下一条语句,会跟踪进入函数,一次一条的执行函数内的代码
-
条件断点:break if 条件 以条件表达式设置断点
-
多进程下如何调试:用set follow-fork-mode child 调试子进程 或者set follow-fork-mode parent 调试父进程
2.8 说说什么是大端小端,如何判断大端小端?
- 小端模式:低的有效字节存储在低的存储器地址。小端一般为主机字节序;常用的X86结构是小端模式。很多的ARM,DSP都为小端模式。
- 大端模式:高的有效字节存储在低的存储器地址。大端为网络字节序;KEIL C51则为大端模式。
- 如何判断:我们可以根据联合体来判断系统是大端还是小端。因为联合体变量总是从低地址存储。
int fun1(){
union test{
char c;
int i;
};
test t; t.i = 1;
//如果是大端,则t.c为0x00,则t.c != 1,反之是小端
return (t.c == 1);
}
2.9 在进行网络通信时是否需要进行字节序转换?
- 相同字节序的平台在进行网络通信时可以不进行字节序转换,但是跨平台进行网络数据通信时必须进行字节序转换。
- 原因如下:网络协议规定接收到得第一个字节是高字节,存放到低地址,所以发送时会首先去低地址取数据的高字节。小端模式的多字节数据在存放时,低地址存放的是低字节,而被发送方网络协议函数发送时会首先去低地址取数据(想要取高字节,真正取得是低字节),接收方网络协议函数接收时会将接收到的第一个字节存放到低地址(想要接收高字节,真正接收的是低字节),所以最后双方都正确的收发了数据。而相同平台进行通信时,如果双方都进行转换最后虽然能够正确收发数据,但是所做的转换是没有意义的,造成资源的浪费。而不同平台进行通信时必须进行转换,不转换会造成错误的收发数据,字节序转换函数会根据当前平台的存储模式做出相应正确的转换,如果当前平台是大端,则直接返回不进行转换,如果当前平台是小端,会将接收到得网络字节序进行转换。
2.10 网络字节序
- 网络上传输的数据都是字节流,对于一个多字节数值,在进行网络传输的时候,先传递哪个字节?也就是说,当接收端收到第一个字节的时候,它将这个字节作为高位字节还是低位字节处理,是一个比较有意义的问题; UDP/TCP/IP协议规定:把接收到的第一个字节当作高位字节看待,这就要求发送端发送的第一个字节是高位字节;而在发送端发送数据时,发送的第一个字节是该数值在内存中的起始地址处对应的那个字节,也就是说,该数值在内存中的起始地址处对应的那个字节就是要发送的第一个高位字节(即:高位字节存放在低地址处);由此可见,多字节数值在发送之前,在内存中因该是以大端法存放的; 所以说,网络字节序是大端字节序; 比如,我们经过网络发送整型数值0x12345678时,在80X86平台中,它是以小端发存放的,在发送之前需要使用系统提供的字节序转换函数htonl()将其转换成大端法存放的数值;