0

我对 tmp linux 与 C 函数的使用有一些疑问

  • 如何使用 C 获取 tmp 的可用空间大小(当 tmp 不是 tmpfs 分区时)?

  • 当 tmp 内存满了 C 时,如何以安全的方式清理 tmp 内存?

笔记:

  • “df -h”不显示 tmp 文件夹,因此 tmp 没有分区

  • proc/meminfo 包含内存信息。如果我们将文件复制到 tmp 文件夹,我们会用复制文件的大小来标记 /proc/meminfo 中的 MemFree 变量的减少

4

3 回答 3

1

通常/tmp是挂载到本地分区上的文件系统。它通常是指向/var/tmp.

详情请看这里

它的内容可能随时被删除。至少在系统启动时清理它是常见的行为。


tmpfs通常是驻留在 SHM(共享内存)中的文件系统,类似于 RAM 磁盘。

我可以引用维基百科

tmpfs 是许多类 Unix 操作系统上临时文件存储设施的通用名称。它旨在显示为已挂载的文件系统,但存储在易失性内存而不是持久存储设备中。类似的结构是 RAM 磁盘,它显示为虚拟磁盘驱动器并托管磁盘文件系统。

于 2012-05-07T16:32:47.210 回答
0

我认为 Linux 发行版中有两种 /tmp 类型,它只是一个文件夹或 tmpfs 分区(来自 RAM 的磁盘)。

于 2012-05-07T16:06:43.110 回答
0

请注意,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的文件描述符。

于 2012-05-07T16:38:58.663 回答