2019暑假内容复习
Posted xiaosanxian
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2019暑假内容复习相关的知识,希望对你有一定的参考价值。
1. 静态库和动态库定义
<1>.链接静态库的时候,会将库中函数实现的代码直接搬移到可执行文件中,生成的可执行文件体积大,运行的时候不需要库的支持。
<2>.链接动态库的时候,只是记录可执行文件所依赖的库名,生成的可执行文件体积小,
运行的时候需要库的支持
(1)查看可执行文件依赖的动态库
readelf -a 可执行文件名 | grep "Shared"
(2)Linux 下动态库和静态库后缀 注意: 库的名字 name
静态库: libname.a
动态库: libname.so
2、编译器特性 注意:gcc 无法识别第三方库(非 gcc 自带的库 )
<1>.gcc 链接库默认搜索路径 /usr/lib 和 /lib
<2>.gcc 包含头文件默认的搜索路径 /usr/include
(1)告诉 gcc 库所在的路径
-L 库所在的路径
(2)告诉 gcc 头文件所在的路径
-I 头文件所在的路径
(3)告诉 gcc 链接的库
-l 库名
3、静态库的制作
(1)将.c 文件变成.o 文件
gcc -c file.c -o file.o
(2)将*.o 文件生成静态库
ar -cr libname.a *.o
4、动态库的制作
(1)将.c 文件变成.o 文件
gcc -c -fpic file.c -o file.o
(2)将*.o 文件生成动态库
gcc -shared -o libname.so *.o
使用生成的库:
gcc main.c -L -l addsub -o test1
-L 指定库查找位置 -I 指定函数库名
静态库添加: -static
5、操作系统加载动态库的搜索路径
(1). 环境变量 LD_LIBRARY_PATH
添加环境变量:
export LD_LIBRARY_PATH=path1:path2:...:$LD_LIBRARY_PATH
永久添加: 将其写入/etc/profile 或 /etc/bash.bashrc
source /etc/profile 或 source /etc/bash.bashrc
(2)./etc/ld.so.cache 配置文件中搜索
A. 在/etc/ld.so.conf.d 路径建立自己配置文件(mylib.conf)
B. 在自己配置文件中添加自己的库所在的路径
C. ldconfig (生效)
(3). /lib 和 /usr/lib
6、动态库和静态库同时存在
他们同时存在的时候,gcc 默认链接的是动态库,如果想链接静态库 ,需要加上 –static
操作步骤:
在命令中输入 vi –t 类型名、结构体名或者函数名
系统就会寻找相应的对象,默认是在当前目录的 tags 中搜索,如我们想寻找 stat 结构体,则输入 vi –t stat
然后按 q
退出选择,输入选项,这里我选择 3
例子: vi -t stat
按q退出
Choice number (<Enter> cancels):
输入3
如果结构体出现了嵌套,即结构体中有结构体,则将光标移动到该结构体
按住ctrl + ] 组合键 就跳到下一个结构体的定义中,
组合键 ctrl + t 是表示返回。
此时,我们就可以用该方法查询 FILE,
vi –t FILE 最后得到
/***************代码测试通过********************/
如何动态开辟一个二维数组?
int **malloc_arry(int r,int c){
int size =sizeof(int);
int point_size= sizeof(int *);
//先申请内存,其中point_size乘以r表示存放r个行指针
int **arr=(int **)malloc(point_size*r+size*r*c);
if(arr!=NULL){
memset(arr,0,point_size*r+size*r*c);
int *head=(int *)((int )arr+point_size*r); //看不懂??
while(r--)
arr[r]=(int *)((int)head+r*c*size);
}
return (int **)arr;
}
// 释放二维数组
void free_arry(void **arry)
{
if(arr!=NULL)
free(arr);
}
int main(){
printf("请输入行列(中间以空格隔开):");
int nr,nc;
scanf("%d %d"&nr,&nc);
int **p =malloc_arry(nr,nc);
//为二维数组赋值,输出
}
/*************************************************/
pthread_once(); 保证线程只执行依次对应的函数
pthread_once_t once=PTHREAD_ONCE_INIT; 第一个参数
线程常见锁:
普通锁 嵌套锁 检错锁 适应锁
(函数执行成功返回0 处于锁定状态返回EBUSY)
条件变量:线程间共享的全局变量进行同步,一个线程在使用完资源后,“设置条件为真”
错误检查: #include <errno.h>
#ifndef errno
extern int errno;
#endif
提示信息:
#include <string.h>
strerror(int errno);
void perror(const char *message); 打印错误信息到stderr
IPv6 ,地址长度多达 128 位
Pv4 和 IPv6 兼容的函数有 inet_pton()和 inet_ntop()
ls命令的使用:
-F 按类型列出所有文件,在文件末尾用不同符号区分:
斜线(/) 表示目录
星号(*) 表示可执行文件 例子: ls -F *
@符号 表示链接文件
字符串数组的形式:
è char string1[7]="China";
è char string2[ ] = "China";
è char string3[7]= { ‘c‘,‘h‘,‘i‘,‘n‘,‘a‘ };
è char string4[7]= { ‘c‘,‘h‘,‘i‘ ,‘n‘,‘a‘,‘ ‘};
一份源码解压后的统计结果:
Usage: du [OPTION]... [FILE]...
Or: du [OPTION]... --files0-from=F
Summarize disk usage of each FILE, recursively for directories.
例子: /linux-3.4.107$ du --max-depth=1 –h
IP地址的网络号:
每台主机有一个32位的子网掩码,将IP地址与子网掩码,进行按位“与”
vi是 :visual interface的简称
?string<Enter>
在命令行模式下输入?和要查找的字符串 “string”
按下SPACE 键,向后翻一页 B键 向前翻 一页
在底行模式下执行命令:
:!command 例: !ls /home
显示行号:
set nu (再输入 visual 就可以显示行号)
系统预先定义的全局变量:
#include <unistd.h>
extern char **environ; 打印环境变量
在main函数中 int main(int argc,conast char *argv[],extern char **environ);
线程编译说明:
gcc createpthread.c -lpthread(一定要加)
pthread_create(&thid,NULL,(void *)thread,NULL)
对应的线程函数: int * thread(void )
或者:
pthread_create(&thid,NULL,thread,NULL);
对应的线程函数:void * thread(void *a);
int *f(int i,int j); 由于( )的优先级高于*,f与()先结合
指向函数的指针:
类型名 (*指针变量名)();
int (*p)(int i,int j); p是一个指针,它指向一个函数
函数指针作为形参:
int get_max(int i,int j,int k,int (*p)(int ,int));
perror() 打印错误信息到stderr
kill -l
显示linux系统支持的全部信号
内核结构体出现了嵌套,即结构体中有结构体,则将光标移动到该结构体,按住
ctrl + ] 组合键就跳到下一个结构体的定义中,
组合键 ctrl + t 是表示返回。
先定义,后使用的原则
*P++ 等价于 *(p++) 先得到p所指向的变量(*p),再使p++
*++p 等价于 a[++i]
int (*p)(int ,int ) 为一个指向函数的指针
百位,十位,个位获取方法?
b=number /100;
s = number/10%10;
g = number%100%10;
语法问题:
char *path;
path=argv[2];
报错: warning: assignment discards qualifiers from pointer target type
修改:加上强制类型转换类型path=(char *)argv[2];
八进制转换:
mode=(mode_u*8*8) + (mode_g*8) + mode_o;
查看当前系统中的进程
ps pstree
以列表形式搜索单一文件名
ls -l |grep emp.dat
开机启动 Linux 过程总体介绍:
→?★用户打开 PC 的电源时,CPU 将自动进入实模式,并从地址 0xFFFF0 开始自动执行程序代码,这个地址通常是 ROM-Bios 中的地址。
这时 BIOS 进行开机自检,并按 BIOS 中设置的启动设备(通常是硬盘)进行启动,接着启动设备上安装的引导程序
lilo 或 grub 开始引导 Linux(也就是启动设备的第一个扇区),这时,Linux 才获得了启动权。
→?★接下来的第二阶段,Linux 首先进行内核的引导,主要完成磁盘引导、读取机器系统数据、实模式和保护模式的切换、加载数据段寄存器以及重置中断描述符表等。
→?★第三阶段执行 init 程序(也就是系统初始化工作),init 程序调用了 rc.sysinit 和 rc 等程序,而 rc.sysinit 和 rc 在完成系统初始化和运行服务的任务后,返回 init。
→?★第四阶段init 启动 mingetty,打开终端供用户登录系统,用户登录成功后进入了Shell,这样就完成了从开机到登录的整个启动过程。
查看系统版本:
cat /etc/issue
查询文件安装位置:
例子: whereis yum (文件名)
whereis - locate the binary, source, and manual page files for a com-
CentOS及Red Hat Linux安装yum源 :
https://www.linuxidc.com/Linux/2017-02/140205.htm
查询CPU信息:
cat /proc/cpuinfo
redHat使用Xwindows界面登陆。
BS = Browser/Server 就是浏览器与服务器
CS = Client/Server 就是客户端与服务器
查看常用端口号:
sudo vim /etc/services
INADDR_ANY 代表本机所有可用的网络地址。
unsigned char sin_zero[8];
/*填充 0 以保持与 struct sockaddr 同样大小*/
const char *argv[]; 输出argv[1] 第二个参数开始的字符串地址
char **p=argv;
p[i]; 输出行指针对应的每一行数据。
通过使用autotools生成包含多文件的makefile
gcc编译器: 加入 -I dirname
将名为dirname的目录加入到程序头文件目录列表中:
他是在预处理阶段使用的选项, I 意为include
查询进程最多可以同时打开多少个文件
ulimit -n
以上是关于2019暑假内容复习的主要内容,如果未能解决你的问题,请参考以下文章