我对 tmp linux 与 C 函数的使用有一些疑问
如何使用 C 获取 tmp 的可用空间大小(当 tmp 不是 tmpfs 分区时)?
当 tmp 内存满了 C 时,如何以安全的方式清理 tmp 内存?
笔记:
“df -h”不显示 tmp 文件夹,因此 tmp 没有分区
proc/meminfo 包含内存信息。如果我们将文件复制到 tmp 文件夹,我们会用复制文件的大小来标记 /proc/meminfo 中的 MemFree 变量的减少
我认为 Linux 发行版中有两种 /tmp 类型,它只是一个文件夹或 tmpfs 分区(来自 RAM 的磁盘)。
请注意,ramfs/tmpfs 分区是动态增长的,您的程序负责写入的数据不超过物理 RAM 的数量。
如果df
没有显示挂载为 的分区/tmp
,则/
(根分区)包含它,其大小是您/tmp
可能占用的最大大小。
现在让我们假设你有一个tmpfs
挂载为:
# mount -t tmpfs -o size=100m tmpfs /mnt/tmp
您可以使用以下方法检查其大小df
:
# df -k
Filesystem 1K-blocks Used Available Use% Mounted on
tmpfs 102400 0 102400 0% /mnt/tmp
要获取这些块信息,您可以使用statvfs。例子:
#include <stdio.h>
#include <stdlib.h>
#include <sys/statvfs.h>
int main(int argc, char **argv) {
if (argc != 2) {
fprintf(stderr, "Usage: %s <device>\n", argv[0]);
return EXIT_FAILURE;
}
struct statvfs fsdata;
int result = statvfs(argv[1], &fsdata);
if (result != 0) {
fprintf(stderr, "Failed to stat: %s\n", argv[1]);
return EXIT_FAILURE;
}
printf("Disk %s:\n", argv[1]);
printf(" file system block size: %lu\n", fsdata.f_bsize);
printf(" fragment size: %lu\n", fsdata.f_frsize);
printf(" size of fs in f_frsize units: %d\n", fsdata.f_blocks);
printf(" # free blocks: %d\n", fsdata.f_bfree);
printf(" # free blocks for unprivileged users: %d\n", fsdata.f_bavail);
printf(" # inodes: %d\n", fsdata.f_files);
printf(" # free inodes: %d\n", fsdata.f_ffree);
printf(" # free inodes for unprivileged users: %d\n", fsdata.f_favail);
printf(" file system ID: %lu\n", fsdata.f_fsid);
printf(" mount flags: %lu\n", fsdata.f_flag);
printf(" maximum filename length: %lu\n", fsdata.f_namemax);
return EXIT_SUCCESS;
}
您无法/tmp
在挂载时安全地清理分区。您必须卸载它,这需要关闭所有引用此分区内的 inode的文件描述符。