【问题标题】:how to manage linux tmp space with C [closed]如何使用 C 管理 linux tmp 空间 [关闭]
【发布时间】:2012-05-08 00:50:10
【问题描述】:

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

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

  • tmp内存满了怎么用安全的方式清理C?

注意:

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

  • proc/meminfo 包含内存信息。如果我们将文件复制到 tmp 文件夹中,我们会注意到 /proc/meminfo 中的 MemFree 变量随着复制文件的大小而减小

【问题讨论】:

  • 你的意思是/tmp的空硬盘空间,还是程序的内存?
  • /tmp是linux中的目录但不是硬盘分区,是内存分配
  • 如果我找不到 /tmp 文件夹的分区会怎样。它是直接内存分配(RAM)吗?或者属于/分区
  • 寻找一个快速简单的答案,而无需详细了解

标签: c linux


【解决方案1】:

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

详情请见here

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


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

我可以引用wikipedia:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 在这两种情况下,我认为它们都不是硬盘分区
    • @MohamedKALLEL 它可能是一个物理磁盘分区,因为您可以使用/tmp 作为其挂载点来挂载一个分区。
    • tmpfs 通常是驻留在 SHM(共享内存)中的文件系统,类似于 RAM 磁盘。
    【解决方案3】:

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

    【讨论】:

    • 刚刚找到另一个您可能感兴趣的答案:stackoverflow.com/questions/4965355/…
    • df -h 中没有 tmp 的分区,每次向 tmp 文件夹添加文件时可用内存减少
    • 对不起,我更新了我的答案来涵盖这个。
    • /tmp 不属于 /。我将文件复制到 /tmp 文件夹,/ 大小没有减少,但 /proc/meminfo 中的可用内存减少
    • 您不应该期望我们知道您正在使用的文件系统,也不应该知道您的系统是如何配置的。您必须在问题中包含相关详细信息,以便我们正确回答。如果您不知道如何发现您的/tmp 来自哪里,我建议您在Unix & Linux 中发布一个问题,确切地问这个问题。
    猜你喜欢
    • 2017-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多