zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    【DOM】如何给div的placeholder传参
    【nvm】使用nvm将node升级到指定版本
    【Worktile】升级业务组件库后,http的数据返回整个response而不是data问题及解决方案
    js获取上传文件内容
    【正则】正则表达式-零宽断言(?=,?<=,?!,?<!)及常见报错
    【Angular】动态组件
    【扩展】div获取焦点或可编辑
    【CSS】position新增属性sticky
    thinkphp写接口返回固定的形式方法
    thinkphp5计算文件大小
  • 原文地址:https://www.cnblogs.com/xiaosanxian/p/12588200.html
Copyright © 2011-2022 走看看