函数声明 | 函数功能 |
---|---|
| 它是一个 |
| 它是一个 |
| 用于在磁盘上创建一个唯一的临时文件并打开它以进行读写 |
| 它是一个 |
| 它是在 |
| 用于将表示时间的结构体(struct tm)转换为对应的 Unix 时间戳 |
| 它是一个 |
| 它是一个 |
| 用于将浮点数 |
| 用于将浮点数 |
| 用于将浮点数 |
| 用于将文件系统挂载到指定的挂载点,并返回挂载点的文件描述符 |
| 用于将指定内存区域的数据同步到文件中 |
| 用于取消内存映射区域,并释放与之相关的资源 |
| 用于将之前使用mlock()函数锁定的内存区域解锁,使其可被操作系统交换出去或被回收 |
函数声明 | 函数功能 |
---|---|
| 它是一个 |
参数:
AT_FDCWD
,则表示使用当前工作目录返回值:
0
;-1
,并设置错误码(errno
)。#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
int main()
{
int dirfd;
if ((dirfd = open("/tmp", O_RDONLY)) == -1)
{
printf("Error opening directory.\n");
return 1;
}
if (mkdirat(dirfd, "testdir", S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) == -1)
{
printf("Error creating directory.\n");
return 1;
}
close(dirfd);
return 0;
}
在上述的示例代码中,
/tmp
目录并获取其文件描述符 dirfd
;mkdirat()
函数,并将目录的文件描述符、要创建的新目录的名称和路径以及目录的权限模式作为参数传递给函数。如果函数调用成功,则新目录将在 /tmp
目录下创建。close()
函数关闭文件。注意:
mkdirat()
函数时,我们需要确保指定的父目录存在并具有适当的权限。函数声明 | 函数功能 |
---|---|
| 它是一个 |
参数:
返回值:
0
;-1
,并设置错误码(errno
)。#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
// 如果函数调用成功,则在 /tmp 目录下创建一个名为 myfifo 的命名管道
if (mkfifo("/tmp/myfifo", S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP) == -1)
{
printf("Error creating named pipe.\n");
return 1;
}
return 0;
}
注意:
mkfifo()
函数时,我们需要确保指定的路径可被访问并且不存在同名的文件或目录。函数声明 | 函数功能 |
---|---|
| 用于在磁盘上创建一个唯一的临时文件并打开它以进行读写 |
参数:
6
个连续 'X'
的字符串的指针,这些 'X'
将被替换为随机字符以创建唯一的文件名。例如,"/tmp/tempfile-XXXXXX"
将会被替换为类似 "/tmp/tempfile-5ZqYU2"
的唯一文件名。#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
char temp_file_template[] = "tmp/tempfile-XXXXXX";
int fd;
if ((fd = mkstemp(temp_file_template)) == -1)
{
printf("Error creating temporary file.\n");
return 1;
}
printf("Temporary file created: %s\n", temp_file_template);
// 读写临时文件
// 关闭临时文件
close(fd);
return 0;
}
如上演示了,在 windows
下 创建临时文件:
temp_file_template
,它包含连续的 6
个 'X'
;mkstemp()
函数,并将指向 temp_file_template
的指针作为参数传递给函数。如果函数调用成功,则返回新创建文件的文件描述符,并将 temp_file_template
中的 'X'
替换为随机字符以形成唯一的文件名;printf()
函数,输出该临时文件的名称;close()
函数关闭临时文件。0
表示程序执行成功。注意: 在使用
mkstemp()
函数时,我们需要确保提供的模板字符串至少包含6
个'X'
,并且文件命名方式不能与现有文件冲突。
函数声明 | 函数功能 |
---|---|
| 它是一个 |
| 它是在 |
参数:
返回值:
0
;-1
,并设置错误码(errno
)。#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
int main()
{
if (mkdir("tmp/newdir") == -1)
{
printf("Error creating new directory.\n");
return 1;
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
int main()
{
if (mkdir("/tmp/newdir", S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) == -1)
{
printf("Error creating new directory.\n");
return 1;
}
return 0;
}
Windows 下示例运行结果
函数声明 | 函数功能 |
---|---|
| 用于将表示时间的结构体(struct tm)转换为对应的 Unix 时间戳 |
参数:
struct tm
结构体的指针,其中包含要转换为 Unix
时间戳的日期和时间信息返回值:
Unix
时间戳;-1
。#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
struct tm my_time = {0}; // 初始化为 0,避免随机值影响结果
my_time.tm_year = 2023 - 1900; // 年份应该减去 1900
my_time.tm_mon = 4 - 1; // 月份从 0 开始计数,应该减去 1
my_time.tm_mday = 15;
my_time.tm_hour = 10;
my_time.tm_min = 30;
my_time.tm_sec = 0;
time_t timestamp = mktime(&my_time);
if (timestamp == -1)
{
printf("Error converting time to timestamp.\n");
return 1;
}
printf("Unix timestamp: %lld\n", timestamp);
return 0;
}
在上面的示例代码中,
struct tm
结构体 my_time
,并将其初始化为 0
;1900
,月份应该从 0
开始计数减去 1
;mktime()
函数,并将指向 my_time
结构体的指针作为参数传递给函数。如果函数调用成功,则返回对应于输入时间的 Unix
时间戳。Unix
时间戳。注意:
mktime()
函数时,我们需要确保提供的 struct tm
结构体中的所有字段都已正确设置。mktime()
函数所使用的时区可能与系统默认的时区不同,所以在某些情况下,转换结果可能会有一定偏差。函数声明 | 函数功能 |
---|---|
| 它是一个 |
参数:
返回值:
0
;-1
,并设置错误码(errno
)。#include <stdio.h>
#include <stdlib.h>
#include <string.h> // memset 函数所需头文件
#include <sys/mman.h> // mlock 函数所需头文件
#define PAGE_SIZE 4096 // 页大小
int main()
{
char *buf;
size_t size = PAGE_SIZE;
// 分配一段内存并清零
buf = (char *)malloc(size);
memset(buf, 0, size);
// 锁定分配的内存区域
if (mlock(buf, size) == -1)
{
printf("Error locking memory.\n");
return 1;
}
// 使用分配的内存...
strncpy(buf, "Hello world!", size);
printf("%s\n", buf);
// 解锁内存区域
if (munlock(buf, size) == -1)
{
printf("Error unlocking memory.\n");
return 1;
}
free(buf);
return 0;
}
在上述的示例代码中,
malloc()
函数分配了一个页大小的内存区域,并使用 memset()
函数将其清零;mlock()
函数,并将指向分配内存区域起始地址的指针以及内存区域的长度作为参数传递给函数。如果函数调用成功,则锁定分配的内存区域,防止其被交换到磁盘上;strncpy()
函数向上述的分配内存区域中写入字符串 "Hello world!"
,并通过 printf()
函数输出该字符串】;munlock()
函数解除内存区域的锁定;注意: 在使用
mlock()
函数时,我们需要确保指定的内存区域已正确分配并且足够大,以避免锁定错误的内存区域。
函数声明 | 函数功能 |
---|---|
| 它是一个 |
参数:
NULL
,由内核选定PROT_NONE
: 区域不能被访问。PROT_READ
: 区域可被读取。PROT_WRITE
: 区域可被写入。PROT_EXEC
: 区域可被执行。MAP_SHARED
: 允许多个进程共享该映射区域,对映射区域所做的修改将反映到所有共享该区域的进程中。MAP_PRIVATE
: 该映射区域只允许当前进程进行访问,对映射区域所做的修改不会反映到其他进程中。MAP_FIXED
: 强制将映射区域放置在指定的地址处(如果该地址已经被占用,则会导致错误)。MAP_ANONYMOUS
: 创建一个匿名映射区域,不与任何文件关联。MAP_FILE
: 将映射区域与文件关联,需要指定文件描述符和偏移量。MAP_LOCKED
: 指示内核在物理存储器中锁定映射区域的页面,以确保在访问该区域时不会发生缺页中断。#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
int main()
{
int fd;
char *ptr;
// 打开文件
if ((fd = open("example.txt", O_RDWR)) == -1)
{
printf("Error opening file.\n");
return 1;
}
// 将文件映射到内存中
ptr = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (ptr == MAP_FAILED)
{
printf("Error mapping file.\n");
return 1;
}
// 使用映射区域进行读写操作
strncpy(ptr, "Hello world!", 13);
printf("%s\n", ptr);
// 取消映射并关闭文件
if (munmap(ptr, 4096) == -1)
{
printf("Error unmapping file.\n");
return 1;
}
close(fd);
return 0;
}
上述的示例代码,演示了如何使用 mmap()
函数将一个文件映射到内存中,并使用指针 ptr
访问这个映射区域 :
open()
函数打开文件 "example.txt"
,并检查是否成功打开。mmap()
函数将文件的前 4096
字节映射到内存中,同时指定保护方式为可读写(PROT_READ | PROT_WRITE
)以及共享属性(MAP_SHARED
)。strncpy()
函数向映射区域中写入字符串 "Hello world!"
,并通过 printf()
函数输出该字符串。munmap()
函数取消映射,并关闭文件。函数声明 | 函数功能 |
---|---|
| 用于将浮点数 |
| 用于将浮点数 |
| 用于将浮点数 |
参数:
value
的整数部分#include <stdio.h>
#include <math.h>
int main()
{
double x = 3.141592653589793;
double ipart;
double fpart = modf(x, &ipart);
printf("x = %f\n", x);
printf("整数部分 = %.0f\n", ipart);
printf("小数部分 = %f\n", fpart);
float y = 2.718281828459045;
float ipart_f;
float fpart_f = modff(y, &ipart_f);
printf("y = %f\n", y);
printf("整数部分 = %.0f\n", ipart_f);
printf("小数部分 = %f\n", fpart_f);
long double z = 1.414213562373095;
long double ipart_l;
long double fpart_l = modfl(z, &ipart_l);
printf("z = %Lf\n", z);
printf("整数部分 = %.0Lf\n", ipart_l);
printf("小数部分 = %Lf\n", fpart_l);
return 0;
}
函数声明 | 函数功能 |
---|---|
| 用于将文件系统挂载到指定的挂载点,并返回挂载点的文件描述符 |
参数:
NULL
(表示根据 filesystemtype
参数自动选择默认源)#include <stdio.h>
#include <sys/mount.h>
int main()
{
int ret;
const char* source = "/dev/sda1";
const char* target = "/mnt/usbdrive";
const char* type = "ext4";
ret = mount(source, target, type, 0, NULL);
if (ret == -1)
{
perror("mount");
return 1;
}
printf("File system mounted successfully!\n");
return 0;
}
在上面的示例代码中,我们调用 mount()
函数将 /dev/sda1
设备文件上的 ext4
文件系统挂载到 /mnt/usbdrive
目录下,并检查挂载操作是否成功。如果 mount()
函数返回值为 -1
,则表示挂载失败,通过 perror()
函数输出错误信息并返回 1
,程序异常结束;否则,打印 “File system mounted successfully!”
表示挂载成功,并返回 0
,程序正常结束。
函数声明 | 函数功能 |
---|---|
| 用于将指定内存区域的数据同步到文件中 |
参数:
cache
内容无效#include <stdio.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int main()
{
int fd = open("example.txt", O_RDWR);
if (fd == -1)
{
perror("open");
return 1;
}
// 将文件映射到内存中
char* ptr = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (ptr == MAP_FAILED)
{
perror("mmap");
close(fd);
return 1;
}
// 写入新的数据
strncpy(ptr, "Hello world!", 13);
// 同步数据到文件中
int ret = msync(ptr, 4096, MS_SYNC);
if (ret == -1)
{
perror("msync");
munmap(ptr, 4096);
close(fd);
return 1;
}
// 解除映射并关闭文件
ret = munmap(ptr, 4096);
if (ret == -1)
{
perror("munmap");
close(fd);
return 1;
}
close(fd);
return 0;
}
在上面的示例代码中,
open()
函数打开文件 "example.txt"
;mmap()
函数将文件的前 4096
字节映射到内存中;strncpy()
函数向映射区域中写入新的数据,并通过 msync()
函数将修改后的数据同步回磁盘文件;munmap()
函数解除映射并关闭文件。函数声明 | 函数功能 |
---|---|
| 用于取消内存映射区域,并释放与之相关的资源 |
参数:
在调用 munmap()
函数后,操作系统将取消指定的内存映射,并回收相应的资源,包括虚拟地址空间和关联的物理内存页(如果存在)。此外,取消映射还可能导致未同步到磁盘文件中的修改数据丢失。
注意: 必须在对映射区域进行任何修改或者访问之前,先使用
mmap()
函数将文件映射到内存中;并在完成所有操作之后,再使用munmap()
函数解除映射。否则,可能会引发各种错误或者异常情况。
参见 7.2 的 演示示例,这里不再赘述
函数声明 | 函数功能 |
---|---|
| 用于将之前使用mlock()函数锁定的内存区域解锁,使其可被操作系统交换出去或被回收 |
参数:
返回值:
0
;-1
,并设置错误码(errno
)。注意: 只有拥有相应权限的进程才能解锁该内存区域。
参见 6.2 的 演示示例,这里不再赘述
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有