UC编程

来源:互联网 发布:家庭必备熟食 知乎 编辑:程序博客网 时间:2024/04/27 18:18
UC主要内容 是 Unix 的系统函数和 Unix 系统的设计和管理机制
    内容:
      1. Unix Linux 的静态库 和共享库
      2.C语言的错误处理
      3.环境变量和环境表
      4.Unix  Linux 的内存管理
      5.Unix  Linux 的文件操作
      6.Unix  Linux 的目录操作
      7.Unix  Linux 的进程管理
      8.Unix  Linux 的信号处理
      9.IPC - 进程间通信(共享内存,消息队列)
      10.Unix Linux 的网络编程
      11.Unix Linux 的多线程开发
    
    
    编译器 gcc 是编译器的合集,主流语言都可以编译
    gcc -c 只编译,不连接 ,生成目标文件
    gcc -o 改变目标文件的名称    gcc test.c  -o hello
    gcc -E 只做预处理,不编译,不连接  gcc -E test.c -o test.i
    gcc -S 生成汇编文件
    gcc -v 查看编译器的版本
    gcc -Wall  可以显示更多的警告信息


   gcc 的完整过程:
    1.预处理,针对所有的指令(以#开头)
    2.编译,检查基本的语法错误
    3.汇编,把代码变成机器指令
    4.连接,把周边的函数链接进来
vi 中大写 G 可以到文件尾  或命令行输入 $ 符 
C 语言头文件.h 和源文件 .c 的作用
    .h 文件用于各种声明(变量,函数,结构)
    .c 文件放各种实现      
    
    常用的指令    
   #include 包含一个头文件
   #define  定义一个宏 
   #if/elif/ifdef/ifndef/endif  条件编译
   #error  产生错误
   #warning   产生警告
   #pragma    增加一些额外的功能
      #pragma GCC dependency  文件名 a 
       会比较当前文件和 a 谁的时间更新,如果 a 的时间更新,会产生一个警告 
      #pragma GCC poison 单词
      禁止使用 poison 后面的单词,否则产生错误
       #pragma pack(整数) 
         针对 结构的对齐和补齐,整数为 1 取消对齐和补齐,为 2 就是按照 2 的倍数对齐和补齐
    
   环境变量和头文件
    操作系统在运行时,会把一些常用的配置放入内存中,这些叫环境变量,比如:可执行文件 默认情况下要带路径才能执行,但也可以使用环境变量 PATH 去掉路径,只要把可执行文件的路径配置到 PATH (系统路径)中,就可以在执行是省略路径
     命令 echo 可以输出环境变零的值:echo $PATH 多个目录 : 隔开
     在bash中,配置环境变量:
       export PATH=$PATH:.      $PATH 代表之前配置的环境变量依然有效
        :  多个目录分割
        .  当前目录
       想要永久有效需要把 export 写入启动文件中,比如登陆目录 /.bashrc
          用 source .bashrc 重新加载

————————————————————————————————————————————————————————————————————————————

代码都是连接成库文件,在使用时直接面对库文件,而不是一个一个的
Unix / Linux 的库文件有两种 :静态库和共享库(动态库)
商业开发需要提供的是:库文件和头文件  Unix 系统也是这么做的
静态库(.a 文件)是代码的合集,在使用时直接复制代码到目标文件中
共享库(.so文件)是代码的合集,在使用时把代码(函数) 的地址存到目标文件中
静态库的优点速度稍快,运行时不需要再访问静态库,缺点 占用空间大,费资源,不利于代码的维护和修改
共享库优点,省资源,利于代码的维护和修改 ,缺点 速度稍慢,运行是必须连带共享库(可执行文件中没有库函数代码,只有库函数的地址)
商业开发基本都是使用共享库


    1 如何创建和调用静态库
1. 创建
 1.1 写源程序 .c ,保存退出 
 1.2 编译源程序,生成目标文件 .o     gcc -c  add.c
 1.3 把目标文件打包成静态库文件  
       ar -r 库文件名  add.o  (如果多个,在后面继续写) 
库文件名命名规范: 以 lib 开头,后缀是 .a 中间写库名
比如   libmyku.a  整体是库文件名 , 库名是 myku 
     2. 调用
 2.1 写源程序  testadd.c 
 2.2 编译源程序,生成目标文件 .o        gcc -c testadd.c 
 2.3 连接 testadd.o 和库文件 ,三种方法
   a 直接连接  gcc testadd.o libmyku.a
b 配置环境变量 LIBRARY_PATH ,把库文件所在路径配置进去,然后用命令:
             gcc testadd.o -lmyku  (库名)
   c 双 L 配置 ,用命令: gcc testadd.o -lmyku -L路径

    2 共享库的创建和使用
2.1 创建 
  a 写源程序,保存退出
  b 编译源程序,生成 .o 文件
      gcc -c -fpic add.c 
  c 生成共享库文件(.so) 
     gcc -shared add.o -olibmyku.so  共享库命名规范:以lib 开头,以 .so 后缀,中间库名
2.2 调用
 a 写源程序 testadd.c 保存退出
 b 编译源程序,生成 .o 文件
 c 连接,与静态库一样,三种方法   gcc testadd.o -lmyku -L ( 双L )
 注 : 连接成功的 a.out 在运行时,必须配置  export LD_LIBRARY_PATH=库路径 才能运行起来

————————————————————————————————————————————————————————————————————————————
     关于库的命令:
ldconfig 可以管理共享库
ldd 可以察看相关的共享库
  ldd a.out  
  某些共享库后缀是 .so.整数    
   
    系统提供了一些函数可以直接在程序中打开共享库,执行其中的函数(动态编程API)
  API 应用程序接口 (程序对外提供的函数)

#include<dlfcn.h>
 dlopen()     打开共享库
 dlsym()     从一个打开的共享库中获取一个函数
 dlclose()   关闭打开的共享库
 dlerror()    用于处理错误 

C 语言的错误处理, 程序员编写软件时,除了正确的分支要处理,出现意外情况(错误) 时也要做相应的处理
后期的语言(c++/java) 都使用异常机制处理错误,c 语言中没有异常,用返回值代表出错,出错的代码单独写分支,

有4中常见的出错代表方式 :
 1.如果返回是 int ,并且返回的数据不可能是负数,用返回 -1 代表出错
 2.如果返回值是 int ,并且返回的数据可能是负数,用指针把数据带回,返回 0 代表正确,返回 -1 代表出错
 3.如果返回值是指针类型,返回 NULL 代表出错
 4.如果不需要考虑错误处理,返回值定义为 void 即可


 函数返回值数据的方法有两种
 1.return 返回 
 2. 用指针参数带出 

    在 C 语言中,关于错误处理,也提供了支持,
提供了一个外部的全局变量, errno 用于存储错误的编号,每个错误的编号都对应一种错误信息
有 3 个函数可以依靠错误编号获取错误的信息 
strerror()  --传入一个错误编号,返回错误信息,
perror()    --传入一个字符串(附加数据),打印错误信息(自动去找errno)
    printf("%m") -- 打印错误信息(自动找 errno)

    man 可以查询 unix 命令,函数和头文件,如果重名,可以 man 2  或 man 3

   在程序中也可以获取/修改环境变量
   在系统中,定义了一个外部全局变量存储了所有的环境变量,其实是一个字符指针数组
   只要在程序中,写上:
     extern char **environ // 字符指针数组
      environ 就是环境表的首地址,存储了所有的环境变量,以 NULL 结束
 
 int i = 5;
 int *pi = &i;
 pi 是指针,存储 i 的地址,指向 i ,i 是普通变量,存储的 5,i 自身对应一块内存区域,
 pi++ 和 pi+1 的移动效果一样
 pi + 1 的移动效果:移动到下一个元素上,pi +1 移动的字节数 由 指向的类型决定,
 char * 移动 1 个字节,int * 移动 4 个字节
     
数组类型都是常指针,就是不能改变地址的指针,因此数组不能再次赋值,但数组元素可以赋值 


       自定义头文件可以用三种方式 include 
        1.用 "" 方式
        2.gcc -I 目录  (大写 i) 
        3.配置环境变量 CPATH      export CPATH=目录
0 0
原创粉丝点击