菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
93
0

2019暑假内容复习

原创
05/13 14:22
阅读数 73333

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','\0'};

 

一份源码解压后的统计结果:

                   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

发表评论

0/200
93 点赞
0 评论
收藏
为你推荐 换一批