• 拾遗:Unix/Linux C_00


    零、UNIX 标准:ISO C、IEEE POSIX、Single UNIX Specification

    • XSI:X/OPEN System Interface
    • Open Group 拥有 UNIX 商标,只有遵循  XSI 的实现才能称为 UNIX
    • SUS(Single UNIX Specification) 是 Open Group 的出版物,Open Group 诞生于 1996 年,由 X/Open 和 OSF 合并而成

    一、GCC

    • gcc -I dir:添加头文件目录;
    • gcc -L dir:添加库文件目录;
    • gcc -o prog prog.c:指定编译结果的文件名称;
    • gcc -c:只编译,不链接;
    • lib*.a:传统静态库文件(gcc -o xxx xxx.c /PATH/TO/lib*.a 或 gcc -o xxx xxx.c -l*);
    • lib*.so.N:动态库文件(gcc -o xxx xxx.c /PATH/TO/lib*.so.N 或 gcc -o xxx xxx.c -L /PATH -l*),指定路径或“-lm”形式均可;

    二、header files

    • 头文件仅包含函数的声明,不包含任何可执行代码;其作用是指明需要链接的库文件;库文件通常是只编译但未链接的一个个单功能模块;

    三、static library

    • 编写单独的函数文件(即不包含main(){}),使用gcc -c生成 object module;
    • 使用 ar crv libfoo.a xx.o xy.o 生成静态库文件libfoo.a(即文件打包),用 ranlib libfoo.a 创建内置文件目录(GCC可选,BSD系统需要),使用 nm -s 查看打包文件详情;

    四、shared library

    • ldd prog:显示程序用到的动态库;
    • ldconfig -v:修改动态库配置文件 /etc/ld.so.conf 后,使新文件生效;
    • gcc -shared xxx.o:将.o文件转化成动态库;

    五、linux kernel的职责

    • 进程调度;
    • 内存管理;
    • 提供文件系统;
    • 创建与终止进程;
    • 对设备的访问;
    • 联网;
    • 提供系统调用应用程序接口(API);
    • 提供多用户操作空间(vitual private computer);

    六、进程终止和终止状态

    • 进程可使用_exit()系统调用或exit()相关的库函数请求退出,也可向进程传递信号,将其终止;两种方式均会生成终止状态,一个非负小整数,供父进程的wait()系统调用检测;
    • C库函数是对系统调用的更上一层抽象,fopen()、fclose()、fread()、fwrite()、fgets()、fputs()、remove()等是基于open()、close()、read()、write()、ioctl()、unlink()、rmdir()等系统调用之上构建的;系统调用本身会占用硬件资源;Linux系统调用层面不存在文本概念,一切均是二进制,系统本质上只提供一种文件系统——字节流;

    七、杂项

    • 进程可使用setrlimit()系统调用为自身设置资源占用上限——soft limit、hard limit;
    • kill对应的底层系统调用为kill(),程序可以选择不采取默认的信号动作,如:忽略信号(-9信号必然执行)、屏蔽信号或建立自己的信号处理器;
    • 多线程通过全局变量或IPC共享数据;多线程更能发挥多处理器的性能;
    • 用户空间:进程的虚拟地址空间;
    • C语言的系统调用通过wrapper函数实现;设计库函数是为了提供比底层系统调用更方便的调用接口;
    • strace命令可追踪程序的系统调用过程,用于调试程序或研究程序的运作机制;
    • 标准库函数getopt()、getopt_long()用于解析命令行参数;

    八、进程间通信(IPC)

    • 信号signal,形式:SIGxxxx;
    • 管道pipe;
    • BSD套接字socket;system V FIFO;
    • 文件锁定file lock;
    • 消息队列MESSAGE QUEUE;
    • system V信号量semaphore;
    • 共享内存shared memory;

    九、进程组(会话、任务)

    • 会话中所有会话都具有相同的会话标识符,首进程(session leader)的PID会成为会话ID;
    • 会话可以包含多个进程组;
    • 一个会话对应一个控制终端;
    • 使用会话最多的是支持任务控制的shell,由shell创建的所有进程与shell自身隶属于同一会话,shell是此会话的首进程;

    十、日期和时间

    • 自1970-01-01 00:00:00起的秒数(需要进行时区调整),即国际协调时间,简称为UTC;
    • 系统cpu时间,指系统调用或其它内核服务的耗时;用户cpu时间,指执行常规的程序代码耗时;

    十一、实时性realtime

    • 操作系统或应用程序具备的即时响应能力,用以满足银行ATM、飞机导航系统等场景的需求;
    • unix/linux支持实时性的策略:异步I/O、共享内存、内存映射文件、内存锁定、实时性时钟和定时器、备选调度策略、实时性信号、消息队列以及信号量等

    十二、查看glibc版本

    • ldd prog | grep libc可查看glibc的路径,执行/PATH/TO/libc.so.N可显示详细版本信息;
    • 调用函数gnu_get_libc_version(),返回一个诸如“2.12”的字符串指针;#include <gnu/libc-version.h>;

    十三、调用error

    • 系统调用或C库调用,必须检查返回状态,通常返回-1表示出错;getpid()、_exit()等少数几个调用不会出错,可以不检查;
    • 系统调用失败时,会将全局int变量errno设置为一个正值,以标识具体的错误;#include <errno.h>;
    • errno不会被自动重置为0,其负值状态可能是之前调用失败造成的;
    • 进行错误检查时,首先检查函数的返回值是否表明调用出错,然后再通过errno确定出错的原因;
    • 库函数perror()与strerror()可用于根据errno的值,返回系统调用或部分库函数调用的错误信息,返指值是一个字符串指针;
    • 调用库函数的错误状态返回方式各有不同,需要参阅对应的man手册;

    十四、exit()与return()

    • exit()包含在stdlib.h头文件中,用于直接退出程序;
    • return()用于退出所在函数;
  • 相关阅读:
    单据的多个状态字段
    Win7 如何阻止程序联网
    强制关机.bat
    Delphi Class of
    坐标转换 GetCursorPos与转换
    Delphi 的RTTI机制浅探-2
    Delphi 的RTTI机制浅探-1
    Delphi 的RTTI机制-3
    Delphi 的RTTI机制-2
    Delphi 的RTTI机制-1
  • 原文地址:https://www.cnblogs.com/hadex/p/5847131.html
Copyright © 2020-2023  润新知