C++函数记录

不常见的内存调用函数等

munmap

munmap 是 C/C++ 标准库中的一个函数,用于解除内存映射。它通常用于释放通过 mmap 函数创建的内存映射区域。munmap 函数的作用是将指定的内存区域从进程的虚拟地址空间中解除映射,并释放相关的资源。

在 C/C++ 中,munmap 函数的原型通常在 <sys/mman.h> 头文件中声明。它接受两个参数:映射区域的起始地址和映射区域的大小。调用 munmap 函数后,操作系统会将指定的内存区域从进程的虚拟地址空间中移除,并释放相关的资源。

需要注意的是,munmap 函数是与操作系统紧密相关的函数,因此在使用时需要谨慎,并遵循操作系统的相关规则和限制。

open

open 是 C/C++ 标准库中的一个函数,用于打开文件。它通常用于在程序中访问和操作文件。

在 C/C++ 中,open 函数的原型通常在 <fcntl.h> 或 <sys/stat.h> 头文件中声明。它接受两个参数:文件路径和打开模式。调用 open 函数后,它会尝试打开指定路径的文件,并返回一个文件描述符,用于后续对文件的读写操作。

open 函数的打开模式参数可以指定文件的访问权限、打开方式、创建方式等。常见的打开模式包括 O_RDONLY(只读)、O_WRONLY(只写)、O_RDWR(读写)、O_CREAT(如果文件不存在则创建)、O_TRUNC(清空文件内容)等。

需要注意的是,open 函数是与操作系统紧密相关的函数,因此在使用时需要谨慎,并遵循操作系统的相关规则和限制。此外,C++ 标准库也提供了更高级的文件操作接口,如 fstream 类,可以更方便地进行文件的读写操作。

ftruncate64

ftruncate64 不是 C++ 标准库函数,而是一个特定于 Linux/Unix 系统的函数。它用于调整已打开文件的大小。

在 Linux/Unix 系统中,ftruncate64 函数用于将已打开文件的大小截断为指定的长度。它接受两个参数:文件描述符和目标文件大小。通过调用 ftruncate64 函数,可以将文件截断为指定的大小,可能会删除文件末尾的内容或在文件末尾添加空字节。

需要注意的是,ftruncate64 函数是特定于 64 位文件大小的版本,用于处理大于 2GB 的文件。对于小于 2GB 的文件,可以使用 ftruncate 函数。

要使用 ftruncate64 函数,通常需要包含 <unistd.h> 头文件,并在链接时链接对应的库(如 -lrt)。请注意,ftruncate64 函数在不同的操作系统和编译环境中可能会有所不同,因此在使用时请参考相关的系统文档和编译器文档。

mmap

mmap 不是 C++ 标准库函数,而是一个系统调用函数,用于在内存中创建映射区域。

mmap 函数在 Linux/Unix 系统中使用,用于将一个文件或设备映射到进程的地址空间,从而可以通过内存访问来读取或写入文件内容。它可以用于实现高效的文件 I/O 操作,以及共享内存的通信。

在 C++ 中,可以使用 mmap 函数通过调用操作系统提供的接口来创建映射区域。通常需要包含 <sys/mman.h> 头文件,并在链接时链接对应的库(如 -lrt)。

需要注意的是,mmap 函数是特定于操作系统的,因此在不同的操作系统和编译环境中可能会有所不同。在使用 mmap 函数时,请参考相关的系统文档和编译器文档,以了解其使用方法和注意事项。

msync

msync 是一个系统调用函数,而不是一个 C++ 库函数。它用于将指定的内存区域同步到对应的文件中。

在 C++ 中,可以使用 <unistd.h> 头文件来包含 msync 函数的声明。这个函数通常用于与 mmap 函数一起使用,以确保对内存映射区域所做的修改能够及时地写入到文件中。

msync 函数被用于同步 ShmLogReadStruct 结构体中 status 字段的修改。msync 函数的第一个参数是要同步的内存区域的起始地址,第二个参数是要同步的内存区域的大小,第三个参数是同步的选项。

通过调用 msync(&read_struct->status, sizeof(read_struct->status), MS_SYNC),代码将 ShmLogReadStruct 结构体中 status 字段的修改同步到磁盘上的文件系统。这样做可以确保在修改 status 字段后,对应的数据被持久化,以便在系统重启或其他情况下仍然可用。

需要注意的是,msync 是一个 POSIX 标准的函数,因此它在不同的操作系统上可能会有一些细微的差异。在 Windows 系统上,可能需要使用相应的系统调用函数来实现类似的功能。

memcpy

memcpy 是一个 C++ 标准库函数,用于在内存之间进行数据的拷贝。

它的函数原型通常在 或 <string.h> 头文件中声明,如下所示:

1
void* memcpy(void* destination, const void* source, size_t num);

memcpy 函数接受三个参数:

  • destination:目标内存的指针,表示拷贝后数据的存放位置。
  • source:源内存的指针,表示要拷贝的数据的起始位置。
  • num:要拷贝的字节数。

memcpy 函数将从源内存中拷贝 num 个字节的数据到目标内存中。它是一种高效的内存拷贝方法,可以用于拷贝任意类型的数据,包括基本类型、结构体、数组等。

需要注意的是,memcpy 函数不会检查目标内存和源内存的边界,因此在使用时需要确保目标内存有足够的空间来存放拷贝的数据,以避免发生内存越界错误。

shmctl

shmctl 是一个用于控制共享内存段的系统调用函数。它可以用于执行各种操作,如获取、修改或删除共享内存段。

函数原型如下:

int shmctl(int shmid, int cmd, struct shmid_ds *buf);

参数说明:

  • shmid:共享内存段的标识符,由 shmget 函数返回。
  • cmd:要执行的操作命令,可以是以下值之一:
  1. IPC_STAT:获取共享内存段的状态信息,并将其存储在 buf 参数指向的 shmid_ds 结构体中。
  2. IPC_SET:设置共享内存段的状态信息,buf 参数指向的 shmid_ds 结构体中包含要设置的新值。
  3. IPC_RMID:删除共享内存段。
  • buf:指向 shmid_ds 结构体的指针,用于存储共享内存段的状态信息。

返回值:

  • 成功时,返回 0 或执行的操作相关的值。
  • 失败时,返回 -1,并设置 errno 来指示错误的原因。

通过调用 shmctl 函数,可以获取共享内存段的状态信息、修改共享内存段的状态或删除共享内存段。这个函数在对共享内存进行管理和控制时非常有用。

shmat

shmat 是一个系统调用函数,用于将共享内存段附加到调用进程的地址空间中。

函数原型如下:

void *shmat(int shmid, const void *shmaddr, int shmflg);

参数说明:

  • shmid:共享内存段的标识符,由 shmget 函数返回。
  • shmaddr:指定共享内存段附加到进程地址空间的地址。通常设置为 NULL,表示由系统自动选择一个合适的地址。
  • shmflg:附加标志,可以使用 SHM_RDONLY 表示只读模式,其他情况下可以设置为 0。

返回值:

  • 成功时,返回共享内存段附加的地址。
  • 失败时,返回 (void *) -1,并设置 errno 来指示错误的原因。

通过调用 shmat 函数,可以将共享内存段连接到调用进程的地址空间中,使得进程可以访问共享内存中的数据。返回的地址可以用于访问共享内存中的数据。需要注意的是,使用完共享内存后,应该使用 shmdt 函数将其从进程地址空间中分离。