简介

libxmu-dev

libxmu-dev 是针对 Linux 操作系统的一个开发包,用于开发基于 X Window 系统的图形用户界面应用程序。下面我将为你详细解释一下这个开发包的相关内容。

  1. X Window 系统:X Window 系统,也称为 X11,是一种用于图形界面的基础架构,允许在计算机屏幕上绘制图形和显示图像。它提供了基本的图形绘制、窗口管理、用户输入等功能,是许多图形用户界面环境的基础。

  2. libxmu-dev 包含的内容libxmu-dev 是一个开发包,提供了与 X Window 系统和 Xlib 相关的头文件和库文件,以便开发者能够创建使用 X Window 系统的图形界面应用程序。这个开发包的内容包括:

    • 头文件(Header Files):这些头文件包含了与 Xlib 库函数和数据结构相关的声明,使开发者能够在代码中使用这些函数和结构体。头文件的扩展名通常是 .h

    • 库文件(Library Files):库文件包含了编译好的 Xlib 库函数的二进制代码,这些库可以在链接时与应用程序一起使用。库文件的扩展名通常是 .a(静态库)或 .so(共享库)。

  3. Xlib 库:Xlib 是 X Window 系统的客户端库,它提供了一组函数和数据结构,用于与 X 服务器进行通信、创建窗口、处理事件、绘制图形等。通过使用 Xlib,开发者可以在应用程序中管理窗口、绘制图形元素、响应用户输入等。

  4. Xmu 库:Xmu 是 X Window 系统的辅助库,它建立在 Xlib 之上,提供了一些常见的功能,如字符串处理、几何结构操作、资源管理等。libxmu-dev 中的文件可能包括 Xmu 库的头文件和库文件,使开发者能够更方便地使用这些功能。

总之,libxmu-dev 提供了开发基于 X Window 系统的图形界面应用程序所需的工具和资源,包括 Xlib 和 Xmu 库的头文件和库文件。通过使用这些工具,开发者可以创建具有丰富图形界面的应用程序,处理窗口、事件、图形绘制等任务。

linux-vdso.so

  • linux-vdso.so.1 是一个特殊的动态链接库,它在 Linux 系统中起着重要的作用。VDSO 是 Virtual Dynamic Shared Object(虚拟动态共享对象)的缩写,它是 Linux 内核提供的一种特殊的机制,用于在用户空间和内核空间之间进行高效的系统调用。
  • linux-vdso.so.1 库实际上不是一个真正的共享库文件,而是内核在每个进程的地址空间中映射的一个虚拟文件。它通过特殊的技术将一些常见的系统调用实现以内联汇编的方式嵌入到用户空间程序中,避免了频繁的用户态到内核态的切换。
  • 通过使用 VDSO,一些常见的系统调用,例如获取当前时间、获取进程 ID、获取系统调用号等,可以在用户空间直接执行,而无需陷入内核执行。这大大减少了系统调用的开销,提高了程序的性能。
  • linux-vdso.so.1 是一个系统生成的文件,其路径通常为 “/lib/ld-linux.so.2” 或 “/lib/ld-linux-armhf.so.3” 等,具体路径取决于系统架构和配置。
  • 需要注意的是,由于 linux-vdso.so.1 是在内核启动时动态生成的,因此你不会在文件系统中找到实际的库文件。它在运行时通过内核的机制自动映射到每个进程的地址空间中。

ld-linux-armhf.so

  • ld-linux-armhf.so 是 ARM 架构上的动态链接器,用于在 ARM 处理器上运行基于动态链接的可执行文件。它是 Linux 系统中的一部分,用于加载和解析可执行文件以及它们所依赖的动态链接库。
  • 动态链接器(linker)是一个系统组件,负责在运行时将可执行文件和动态链接库组合在一起,解决符号引用,建立程序的运行环境,并开始执行程序。
  • ld-linux-armhf.so 针对 ARM 架构上的硬浮点 ABI(Application Binary Interface)进行了优化。它确保可执行文件和动态链接库在 ARM 架构上以正确的方式加载和运行,并与其他系统组件协同工作。
  • 需要注意的是,ld-linux-armhf.so 的名称可能会因操作系统版本、发行版或具体的 ARM 架构变体而有所不同。不同的 ARM 架构和操作系统可能使用不同的链接器名称和路径。

libpostproc.so

  • libpostproc.so 是 FFmpeg 多媒体处理库中的一个动态链接库(shared library)文件。FFmpeg 是一个开源的跨平台多媒体框架,用于处理音频、视频和其他多媒体数据。
  • libpostproc.so 库提供了视频后处理的功能,包括图像滤镜、色彩空间转换、图像调整等。它可以用于在视频处理过程中对图像进行修正、增强和优化,提供更好的视觉效果。
  • 通过链接 libpostproc.so,开发人员可以在他们的应用程序中使用 FFmpeg 提供的视频后处理功能。这对于需要进行视频处理和编辑的应用程序、媒体播放器、转码工具等非常有用。
  • 需要注意的是,libpostproc.so 是 FFmpeg 中的一部分,它是一个开源的项目,因此可以在多个平台上使用。在不同的操作系统和平台上,libpostproc.so 的具体名称和路径可能会有所不同,但提供的视频后处理功能基本相似。

libdrm.so

  • libdrm.so 是一个常见的动态链接库(shared library)文件,它是 Direct Rendering Manager(DRM)的一部分。DRM 是一个用于在 Linux 系统上管理图形设备的子系统,它提供了与显示服务器、图形驱动程序和用户空间应用程序之间的接口。
  • libdrm.so 库提供了一组函数,用于与 DRM 子系统进行交互和通信。它允许用户空间应用程序通过 DRM 接口与图形设备进行交互,进行诸如显示输出、图形渲染、硬件加速等操作。
  • 通过链接 libdrm.so,开发人员可以编写应用程序来管理图形设备,并利用 DRM 提供的功能,如显示模式设置、缓冲区管理、2D/3D 图形渲染等。
  • 需要注意的是,libdrm.so 是特定于 Linux 系统上的 DRM 子系统的库文件。它是在 DRM 子系统和图形驱动程序之间进行通信的桥梁,提供了对图形设备的访问和控制。在不同的 Linux 发行版和不同的图形硬件上,libdrm.so 的具体实现和用法可能会有所不同。

libgcc_s.so

  • libgcc_s.so 是一个常见的动态链接库(shared library)文件,它是 GCC(GNU Compiler Collection)的运行时支持库之一。”libgcc_s” 代表 “libgcc support”,该库提供了在使用 GCC 编译的程序中所需的一些运行时支持。
  • libgcc_s.so 库提供了一些与编译器相关的支持函数和运行时环境,用于处理一些特定的语言特性、异常处理、类型转换、整数运算等。它通常用于支持编译器生成的一些代码,以提供必要的运行时支持。
  • 在某些情况下,使用 GCC 编译的程序可能依赖于 libgcc_s.so 库。当运行这些程序时,系统会自动加载和链接 libgcc_s.so,以提供所需的运行时支持。这通常是由于程序使用了一些与编译器相关的功能,或者使用了特定的编译选项。
  • 需要注意的是,libgcc_s.so 是特定于 GCC 的库,因此在使用其他编译器或不同版本的 GCC 上编译的程序可能会使用不同的运行时支持库。在不同的操作系统和平台上,libgcc_s.so 的具体名称和路径可能会有所不同,但其目的和功能基本相似。

libstdc++.so.6

  • libstdc++.so 是一个常见的动态链接库(shared library)文件,它是 GNU C++ 标准库(GNU C++ Standard Library)的一部分。”libstdc++” 代表 “Standard C++”,该库提供了 C++ 标准库的实现
  • libstdc++.so 库包含了各种与 C++ 相关的函数和类,如容器(vector、list、map)、算法(sort、find、transform)、输入输出(iostream、fstream)、字符串处理(string、stringstream)等
  • 这个库是 C++ 编程中非常重要的一部分,它提供了 C++ 标准库的实现,包括常用的数据结构、算法、输入输出等功能,为 C++ 开发人员提供了丰富的工具和函数,简化了开发过程
  • 通过链接 libstdc++.so,应用程序可以使用这些标准库函数和类,从而实现各种 C++ 编程任务,如数据结构操作、算法实现、文件读写、字符串处理等
  • 需要注意的是,libstdc++.so 是在许多操作系统中的标准 C++ 库,包括 Linux、Unix 和类 Unix 系统。在不同的操作系统和平台上,libstdc++.so 的名称和具体实现可能会有所不同,但提供的标准库函数和用法基本上是相似的

libc.so.6

  • libc.so 是一个常见的动态链接库(shared library)文件,它是 C 语言标准库(C Standard Library)的一部分。”libc” 代表 “C”,该库提供了一系列 C 语言的标准函数和常用工具函数的实现
  • libc.so 库包含了各种常用的函数,例如内存操作函数(如malloc、free、memcpy、memset)、字符串操作函数(如strcpy、strcat、strlen)、文件操作函数(如fopen、fclose、fread、fwrite)、数学函数(如abs、sqrt、sin、cos)等
  • 这个库是 C 语言编程中非常重要的一部分,它提供了许多基础的函数和工具,可以帮助开发人员进行内存管理、字符串处理、文件操作、数学计算等各种常见的任务。通过链接 libc.so,应用程序可以使用这些函数,从而简化了代码的编写和开发过程
  • 需要注意的是,libc.so 是在许多操作系统中的标准 C 库,包括 Linux、Unix 和类 Unix 系统。在不同的操作系统和平台上,libc.so 的名称和具体实现可能会有所不同,但提供的标准函数和用法基本上是相似的

libm.so.6

  • libm.so 是一个常见的动态链接库(shared library)文件,它是数学库(Math Library)的一部分。”libm” 代表 “Math”,该库提供了许多数学函数的实现,供应用程序在运行时使用。
  • libm.so 库通常用于执行各种数学操作,例如三角函数、指数函数、对数函数、幂函数等。它包含了标准的数学函数库,使开发人员能够在程序中进行高级数学计算和操作,无需自己实现这些函数
  • 该库提供的函数包括但不限于:sin、cos、tan、exp、log、pow、sqrt 等。通过链接 libm.so,应用程序可以调用这些函数来执行各种数学运算,从而简化了数学计算的实现过程。
  • 需要注意的是,libm.so 是在许多操作系统中标准的数学库,包括 Linux、Unix 和类 Unix 系统。在不同的操作系统和平台上,libm.so 的名称和具体实现可能会有所不同,但提供的数学函数和用法基本上是相似的

libdl.so 动态加载共享库

  • libdl.so 是一个动态链接库(shared library)文件,它是 Linux 操作系统中的一部分。”libdl” 代表 “Dynamic Loading”,该库提供了在运行时动态加载其他共享库的功能。在 Linux 系统中,动态链接库可以在程序执行过程中被加载和卸载,这样可以提供更灵活的代码组织和模块化开发的方式
  • libdl.so 库通常由应用程序使用,用于在运行时动态加载其他共享库。它提供了一组函数,例如 dlopen()dlsym()dlclose() 等,用于加载、查找和卸载其他库中的符号(函数、变量等)。这些函数可以让程序在运行时根据需要加载所需的库,并调用其中的函数或访问其中的变量。
  • 通过 libdl.so,程序可以实现插件化架构、动态加载模块、实现扩展性等。这对于一些需要在运行时动态加载功能的程序,如插件系统、动态链接器、动态加载器等,非常有用
  • 需要注意的是,libdl.so 是 Linux 系统中的库文件,而在其他操作系统中,类似的功能可能由其他库提供,而命名可能也有所不同

libdl.so是Linux系统上的动态链接库,它提供了动态加载和管理共享库的功能。与之对应的头文件是dlfcn.h,它包含了在使用libdl.so库时需要的函数和宏的声明。

以下是dlfcn.h头文件的常见函数和宏:

  1. dlopen函数:
    1
    
    void* dlopen(const char* filename, int flags);
    

    该函数用于打开一个共享库文件,并返回一个指向库句柄的指针。filename参数是共享库文件的路径,flags参数指定了打开库的方式,如RTLD_LAZY表示在需要时才解析符号,RTLD_NOW表示立即解析符号等。

  2. dlsym函数:
    1
    
    void* dlsym(void* handle, const char* symbol);
    

    该函数用于在打开的库中查找指定的符号,并返回符号对应的地址。handle参数是由dlopen返回的库句柄,symbol参数是要查找的符号的名称。

  3. dlclose函数:
    1
    
    int dlclose(void* handle);
    

    该函数用于关闭打开的库。handle参数是要关闭的库的句柄。

  4. dlerror函数:
    1
    
    char* dlerror();
    

    该函数返回上一个动态库函数调用的错误信息。如果没有错误发生,则返回NULL

上述函数和宏的声明都可以在dlfcn.h头文件中找到。为了使用这些函数和宏,需要在C/C++源文件中包含dlfcn.h头文件:

1
   #include <dlfcn.h>

这样,你就可以使用libdl.so库提供的动态加载和管理共享库的功能了。请注意,这些函数和宏在不同的操作系统和平台上可能会有所差异,因此在编写跨平台代码时需要注意相关的兼容性问题。

错误码

  • EPERM ` 1` Operation not permitted
  • ENOENT ` 2` No such file or directory
  • ESRCH ` 3` No such process
  • EINTR ` 4` Interrupted system call
  • EIO ` 5` I/O error
  • ENXIO ` 6` No such device or address
  • E2BIG ` 7` Argument list too long
  • ENOEXEC ` 8` Exec format error
  • EBADF ` 9` Bad file number
  • ECHILD 10 No child processes
  • EAGAIN 11 Try again
  • ENOMEM 12 Out of memory
  • EACCES 13 Permission denied
  • EFAULT 14 Bad address
  • ENOTBLK 15 Block device required
  • EBUSY 16 Device or resource busy
  • EEXIST 17 File exists
  • EXDEV 18 Cross-device link
  • ENODEV 19 No such device
  • ENOTDIR 20 Not a directory
  • EISDIR 21 Is a directory
  • EINVAL 22 Invalid argument
  • ENFILE 23 File table overflow
  • EMFILE 24 Too many open files
  • ENOTTY 25 Not a typewriter
  • ETXTBSY 26 Text file busy
  • EFBIG 27 File too large
  • ENOSPC 28 No space left on device
  • ESPIPE 29 Illegal seek
  • EROFS 30 Read-only file system
  • EMLINK 31 Too many links
  • EPIPE 32 Broken pipe
  • EDOM 33 Math argument out of domain of func
  • ERANGE 34 Math result not representable

sscanf() 正则表达式

  • C++处理字符串的工具函数
    • strcpy, strcat, strlen, strstr
    • sscanf + 正则表达式
  • 函数声明:int sscanf(const char *buffer, const char *format, [ argument ]...);
  • 其中最重要的参数就是format,它可以是一个或多个{ %[*][width][{h|I|I64|L}]type|' '|'\t'| '\n'|非%符号}
  • 常用元字符释义
    • *也可以用于格式中, (即 %*d%*s) 加了星号 (*) 表示跳过此数据不读入,也就是不把此数据读入参数中。
    • {a|b|c}表示a,b,c中选一,[d]表示可以有d也可以没有d
    • width表示读取宽度。
    • {h | l | I64 | L}:参数的size,通常h表示单字节size,I表示2字节 size,L表示4字节size(double例外),l64表示8字节size。
    • type:这一项比较多,就是%s%d之类。
    • 特别的:%*[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值。
    • 未成功匹配返回0 ,否则返回格式化的参数个数。

宏定义,宏函数,内置宏,常用宏

  • 在C语言中,变量类型,循环控制,基础语法等与其他高级语言基本无异;
  • 而C语言(C++)特有的两把双刃剑–指针和宏定义/宏函数,使得C/C++在底层开发中披荆斩棘,无所不能

常用宏定义

  • 防止一个头文件被重复包含
    • #ifndef ICE_BASE_HPP
    • #define ICE_BASE_HPP
    • #endif //ICE_BASE_HPP
  • 重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。
    • typedef unsigned long int uint32; /* Unsigned 32 bit value */

内置宏

  • ANSI标准
    • __LINE__
    • __FILE__
    • __DATE__
    • __TIME__
    • __TIME__
    • __STDC__

__BEGIN_DECLS

  • 许多头文件中都有:
    • 文件开头有__BEGIN_DECLS
    • 文件结尾有__END_DECLS
  • 它们是两个宏定义,声明为:
    • #define __BEGIN_DECLS extern "C"{
    • #define __END_DECLS }

bits/socket.h

  • 特定于系统的套接字常量和类型
  • 这个特定于操作系统的头文件定义了SOCK_*PF_*AF_*MSG_*SOL_*SO_*常量,以及struct sockaddr struct msghdr struct linger 类型。

struct sockaddr

  • 简述:描述通用套接字地址的结构
  • 声明:
    1
    2
    3
    4
    5
    
      struct sockaddr
        {
          __SOCKADDR_COMMON (sa_);	/* Common data: address family and length.  地址族 */
          char sa_data[14];		/* Address data.  14字节,包含套接字中的目标地址和端口信息    */
        };
    
  • 注意:
    • 结构体用来处理网络通信的地址。
    • sockaddr的缺陷是:sa_data把目标地址和端口信息混在一起了,

netinet/in.h

  • 网络协议相关数据结构的声明和定义

  • 简述:描述因特网套接字地址的结构
  • 声明:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
      struct sockaddr_in
        {
          __SOCKADDR_COMMON (sin_);   /* Address Family.   地址族 */
          in_port_t sin_port;			    /* Port number.      16位TCP/UDP端口号 */
          struct in_addr sin_addr;		/* Internet address. 32位IP地址  */
    
          /* Pad to size of `struct sockaddr'.  不使用*/
          unsigned char sin_zero[sizeof (struct sockaddr) -
      			   __SOCKADDR_COMMON_SIZE -
      			   sizeof (in_port_t) -
      			   sizeof (struct in_addr)];
        };
    
  • 注意:
    • 结构体用来处理网络通信的地址。
    • 该结构体解决了sockaddr的缺陷,把port和addr 分开储存在两个变量中
    • 该结构体中提到的另一个结构体in_addr定义如下
      1
      2
      3
      4
      5
      6
      
          /* Internet address.  */
          typedef uint32_t in_addr_t;
          struct in_addr
            {
              in_addr_t s_addr;
            };
      
    • sin_portsin_addr都必须是网络字节序(NBO),一般可视化的数字都是主机字节序(HBO

sockaddr_in和sockaddr

  • 二者长度一样,都是16个字节,即占用的内存大小是一致的,因此可以互相转化。
  • 二者是并列结构,指向sockaddr_in结构的指针也可以指向sockaddr

  • sockaddr常用于bindconnectrecvfromsendto等函数的参数,指明地址信息,是一种通用的套接字地址。
  • sockaddr_in 是internet环境下套接字的地址形式。所以在网络编程中我们会对sockaddr_in结构体进行操作,使用sockaddr_in来建立所需的信息,最后使用类型转化就可以了。

  • 一般先把sockaddr_in变量赋值后,强制类型转换后传入用sockaddr做参数的函数:
    • sockaddr_in用于socket定义和赋值;
    • sockaddr用于函数参数
  • 另外 – 两个函数 htons() 和 inet_addr()
    • htons()作用是将端口号由主机字节序转换为网络字节序的整数值。(host to net)
    • inet_addr()作用是将一个IP字符串转化为一个网络字节序的整数值,用于sockaddr_in.sin_addr.s_addr
    • inet_ntoa()作用是将一个sin_addr结构体输出成IP字符串(network to ascii),例如
      • printf("%s",inet_ntoa(mysock.sin_addr));
    • htonl()作用和htons()一样,不过它针对的是32位的(long),而htons()针对的是两个字节,16位的(short
    • htonl()htons()作用相反的两个函数是:ntohl()ntohs()
    • 它们的声明都在文件netinet/in.h

bits/sockaddr.h

  • struct sockaddr_*通用成员和大小的定义,通用版本。

  • #define __SOCKADDR_COMMON(sa_prefix) sa_family_t sa_prefix##family
  • 这个宏用于声明用于套接字地址的数据类型的初始公共成员,struct sockaddr struct sockaddr_in struct sockaddr_un 等。