Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用C管理linux tmp空间_C_Linux - Fatal编程技术网

如何用C管理linux tmp空间

如何用C管理linux tmp空间,c,linux,C,Linux,我有一些关于使用带有C函数的tmp linux的问题 如何使用C获得tmp的可用空间大小(当tmp不是tmpfs分区时) 当tmp内存充满C时,如何安全地清理它 注: “df-h”没有显示tmp文件夹,因此没有用于tmp的分区 proc/meminfo包含内存信息。如果我们将一个文件复制到tmp文件夹中,我们会注意到/proc/meminfo中MemFree变量随着复制文件的大小而减小 我认为Linux发行版中有两种类型的/tmp,它只是多了一个文件夹或tmpfs分区(RAM中的磁盘)。通

我有一些关于使用带有C函数的tmp linux的问题

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

  • 当tmp内存充满C时,如何安全地清理它

注:

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

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


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

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

详情请参阅

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



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

我可以引述:

tmpfs是许多计算机上临时文件存储设施的通用名称 类似Unix的操作系统。其目的是显示为已安装的 文件系统,但存储在易失性内存中,而不是持久性内存中 存储设备。类似的结构是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
要获取这些块信息,可以使用。例如:

#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;
}
#包括
#包括
#包括
int main(int argc,字符**argv){
如果(argc!=2){
fprintf(stderr,“用法:%s\n”,argv[0]);
返回退出失败;
}
结构statvfs fsdata;
int result=statvfs(argv[1],&fsdata);
如果(结果!=0){
fprintf(stderr,“未能统计:%s\n”,argv[1]);
返回退出失败;
}
printf(“磁盘%s:\n”,argv[1]);
printf(“文件系统块大小:%lu\n”,fsdata.f\bsize);
printf(“片段大小:%lu\n”,fsdata.f\u frsize);
printf(“以f_fr大小单位表示的fs大小:%d\n”,fsdata.f_块);
printf(“#空闲块:%d\n”,fsdata.f#bfree);
printf(“#非特权用户的空闲块:%d\n”,fsdata.f#u bavail);
printf(“索引节点:%d\n”,fsdata.f\u文件);
printf(“#空闲索引节点:%d\n”,fsdata.f#ffree);
printf(“非特权用户的免费索引节点:%d\n”,fsdata.f#u favail);
printf(“文件系统ID:%lu\n”,fsdata.f\u fsid);
printf(“装载标志:%lu\n”,fsdata.f\u标志);
printf(“最大文件名长度:%lu\n”,fsdata.f\u namemax);
返回退出成功;
}

在装入
/tmp
分区时,您无法安全地清理该分区。您必须卸载它,这需要关闭该分区中引用inode的所有文件描述符。

您的意思是为
/tmp
或程序内存清空硬盘空间吗?/tmp是linux中的一个目录,但不是硬盘分区,这是一个内存分配如果我找不到/tmp文件夹的分区,可能会发生什么。它是直接内存分配(RAM)吗?或者它属于/partition寻找一个快速简单的答案,而不需要在这两种情况下详细说明,它们不是硬盘分区Ithink@MohamedKALLEL它可能是一个物理磁盘分区,因为您可以使用
/tmp
作为其安装点来安装分区。
tmpfs
通常是驻留在SHM(共享内存)中的文件系统,类似于RAM-disk。刚刚找到另一个可能让您感兴趣的答案:“df-h”中没有tmp分区,每次我向tmp文件夹中添加文件时,可用内存都会减少。对不起,我更新了我的答案来解决这个问题。/tmp不属于/。我将一个文件复制到/tmp文件夹,/proc/meminfo中的/size并没有减少,但空闲内存却减少了。您不应该指望我们知道您正在使用的文件系统,也不知道您的系统是如何配置的。您必须在问题中包含相关细节,以便我们能够正确回答。如果你不知道如何发现你的
/tmp
来自何方,我建议你在提问时提出一个问题。