linux下的/dev/shm目录

linux中/dev目录下一般都是一些设备文件,例如磁盘、内存、摄像头等。
/dev/shm这个目录是linux下一个利用内存虚拟出来的一个目录,这个目录中的文件都是保存在内存中,而不是磁盘上。其大小是非固定的,即不是预先分配好的内存来存储的。(shm == shared memory)

简要说明

/dev/shm的容量默认最大为内存的一半大小,使用df -h命令可以看到。但它并不会真正的占用这块内存,如果/dev/shm/下没有任何文件,它占用的内存实际上就是0字节。
通过下面的命令,我们可以看到/dev/shm的文件系统为tmpfs,即为临时文件系统。其他的几个tmpfs的挂载目录,其实质上于/dev/shm是一致的。

/home/o [o@o-s] [16:22]
> df -h
文件系统        容量  已用  可用 已用% 挂载点
dev             3.9G     0  3.9G    0% /dev
run             3.9G  656K  3.9G    1% /run
/dev/sda2        58G   12G   43G   22% /
tmpfs           3.9G  1.0G  2.9G   26% /dev/shm
tmpfs           3.9G     0  3.9G    0% /sys/fs/cgroup
tmpfs           3.9G     0  3.9G    0% /tmp
/dev/sdb1        58G   24G   32G   44% /mnt/data
/dev/sda1       488M   26M  463M    6% /boot
tmpfs           791M     0  791M    0% /run/user/1000

文件测试

执行下面命令

/home/o [o@o-s] [16:18]
> ls /dev/shm 

/home/o [o@o-s] [16:18]
> free -m
              total        used        free      shared  buff/cache   available
Mem:           7901         249        2217           1        5434        7595
Swap:             0       

我们可以看到当前/dev/shm目录为空。当前系统使用的内存为249MB,可用内存为7595MB,而buff/cache缓存了5434MB的内容在内存中,并且shared部分仅为1MB大小。
这个缓存的数据可以通过修改/proc/sys/vm/drop_caches文件的内容为3来清理掉。这里就不做了。

现在我们在/dev/shm目录中创建一个大小为1G的文件

/home/o [o@o-s] [16:19]
> dd if=/dev/zero of=/dev/shm/123.random bs=1M count=1024
记录了1024+0 的读入
记录了1024+0 的写出
1073741824字节(1.1 GB)已复制,0.322718 秒,3.3 GB/秒

看看操作后的结果

> free -m
              total        used        free      shared  buff/cache   available
Mem:           7901         248        1191        1025        6461        6571
Swap:             0           0           0

可以看到,现在shared部分的内存已经有了1025MB,并且buff/cache部分也增加了1G多,可用内存减少了1G。

容量修改

如果需要使用到这个目录,并且默认的大小不够使用,而其他程序占用的内存又比较少的时候,可以修改器最大占用内存的大小,来达到自己的目的。
其实修改它的原理很简单,对其进行重新挂载即可,挂载的时候指定挂载参数。

/home/o [o@o-s] [16:38]
> sudo mount -o size=5128M  -o remount /dev/shm

上面对/dev/shm进行了重新挂载,并修改其大小为5G。使用下面的命令查看,可以看到确实已经修改为了5G。

/home/o [o@o-s] [16:38]
> df -h
文件系统        容量  已用  可用 已用% 挂载点
dev             3.9G     0  3.9G    0% /dev
run             3.9G  656K  3.9G    1% /run
/dev/sda2        58G   12G   43G   22% /
tmpfs           5.1G  1.0G  4.1G   20% /dev/shm
tmpfs           3.9G     0  3.9G    0% /sys/fs/cgroup
tmpfs           3.9G     0  3.9G    0% /tmp
/dev/sdb1        58G   24G   32G   44% /mnt/data
/dev/sda1       488M   26M  463M    6% /boot
tmpfs           791M     0  791M    0% /run/user/1000

可以通过修改/etc/fstab文件,来修改默认的参数。

mount的参数可以参考如下
http://www.cnblogs.com/oloroso/p/5405099.html

转载于:https://www.cnblogs.com/smallleiit/p/10706998.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过以下步骤将/dev/ttyUSB0的数据放到共享内存中: 1. 打开/dev/ttyUSB0设备,并设置其属性,例如波特率、数据位、停止位等等。 2. 创建共享内存,通过shmget函数可以创建共享内存,指定共享内存的大小。 3. 通过shmat函数将共享内存映射到进程的地址空间中。 4. 通过read函数从/dev/ttyUSB0设备中读取数据,并将数据写入共享内存中。 5. 通过shmdt函数将共享内存与进程的地址空间分离。 下面是一个简单的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #include <termios.h> #define SHM_SIZE 4096 int main() { int fd = -1; int shmid = -1; char *shmaddr = NULL; struct termios options; // 打开/dev/ttyUSB0设备,并设置属性 fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY); if (fd < 0) { perror("open ttyUSB0 error"); exit(EXIT_FAILURE); } tcgetattr(fd, &options); // 获取当前设置 options.c_cflag |= (CLOCAL | CREAD); options.c_cflag &= ~CSIZE; options.c_cflag |= CS8; options.c_cflag &= ~PARENB; options.c_iflag &= ~(IXON | IXOFF | IXANY); options.c_oflag &= ~OPOST; options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); options.c_cc[VTIME] = 0; options.c_cc[VMIN] = 1; cfsetispeed(&options, B9600); cfsetospeed(&options, B9600); tcsetattr(fd, TCSANOW, &options); // 设置属性 // 创建共享内存 shmid = shmget(IPC_PRIVATE, SHM_SIZE, IPC_CREAT | 0666); if (shmid < 0) { perror("shmget error"); exit(EXIT_FAILURE); } // 映射共享内存到进程地址空间 shmaddr = shmat(shmid, NULL, 0); if (shmaddr == (void *)-1) { perror("shmat error"); exit(EXIT_FAILURE); } while (1) { char buf[256] = {0}; int ret = read(fd, buf, sizeof(buf)); if (ret < 0) { perror("read error"); exit(EXIT_FAILURE); } if (ret == 0) { continue; } // 将读取的数据写入共享内存 strncpy(shmaddr, buf, SHM_SIZE); } // 分离共享内存 if (shmdt(shmaddr) < 0) { perror("shmdt error"); exit(EXIT_FAILURE); } // 删除共享内存 if (shmctl(shmid, IPC_RMID, NULL) < 0) { perror("shmctl error"); exit(EXIT_FAILURE); } // 关闭设备 close(fd); return 0; } ``` 上述代码只是一个简单的示例,实际应用中需要根据具体需求进行修改。同时需要注意的是,共享内存需要在多个进程之间进行共享,需要考虑进程间同步和互斥问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值