linux程序开发

struct stat 作用

https://www.cnblogs.com/changefuture/archive/2011/12/22/2297716.html
https://www.cnblogs.com/hnrainll/archive/2011/05/11/2043361.html

struct stat这个结构体是用来描述一个linux系统文件系统中的文件属性的结构。
在使用这个结构体和方法时,需要引入:
<sys/types.h>
<sys/stat.h>
stat,lstat,fstat1 函数都是获取文件(普通文件,目录,管道,socket,字符,块()的属性。函数原型#include <sys/stat.h>

int stat(const char *restrict pathname, struct stat *restrict buf);提供文件名字,获取文件对应属性。

int fstat(int filedes, struct stat *buf);通过文件描述符获取文件对应的属性。

int lstat(const char *restrict pathname, struct stat *restrict buf);连接文件描述命,获取文件属性。2 文件对应的属性

struct stat {
mode_t     st_mode;       //文件对应的模式,文件,目录等
ino_t      st_ino;       //inode节点号
dev_t      st_dev;        //设备号码
dev_t      st_rdev;       //特殊设备号码
nlink_t    st_nlink;      //文件的连接数
uid_t      st_uid;        //文件所有者
gid_t      st_gid;        //文件所有者对应的组
off_t      st_size;       //普通文件,对应的文件字节数
time_t     st_atime;      //文件最后被访问的时间
time_t     st_mtime;      //文件内容最后被修改的时间
time_t     st_ctime;      //文件状态改变时间
blksize_t st_blksize;    //文件内容对应的块大小
blkcnt_t   st_blocks;     //文件内容对应的块数量
      };

size_t & ssize_t

size_t是标准C库中定义的,应为unsigned int。
ssize_t:ssize_t是signed size_t
定义为typedef int ssize_t。
而ssize_t:这个数据类型用来表示可以被执行读写操作的数据块的大小.它和size_t类似,但必需是signed.意即:它表示的是sign size_t类型的。
size_t是一些C/C++标准在stddef.h中定义的。这个类型足以用来表示对象的大小。size_t的真实类型与操作系统有关。

知识点

  • linux中的off_t类型默认是32位的long int
    off_t类型用于指示文件的偏移量,常就是long类型,其默认为一个32位的整数,在gcc编译中会被编译为long int类型,在64位的Linux系统中则会被编译为long long int,这是一个64位的整数,其定义在unistd.h头文件中可以查看。

linux open()

https://blog.csdn.net/linux_loajie/article/details/43916677

mmap

https://www.jianshu.com/p/755338d11865
https://baike.baidu.com/item/mmap/1322217
mmap将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。mmap在用户空间映射调用系统中作用很大。
头文件 <sys/mman.h>
函数原型
void* mmap(void* start,
size_t length,
int prot,
int flags,
int fd,
off_t offset);
int munmap(void* start,size_t length);

参数fd为即将映射到进程空间的文件描述字,一般由open()返回,同时,fd可以指定为-1,此时须指定flags参数中的MAP_ANON,表明进行的是匿名映射(不涉及具体的文件名,避免了文件的创建及打开,很显然只能用于具有亲缘关系的进程间通信)。

len是映射到调用进程地址空间的字节数,它从被映射文件开头offset个字节开始算起。

prot 参数指定共享内存的访问权限。可取如下几个值的或:PROT_READ(可读) , PROT_WRITE (可写), PROT_EXEC (可执行), PROT_NONE(不可访问)。

flags由以下几个常值指定:MAP_SHARED , MAP_PRIVATE , MAP_FIXED,其中,MAP_SHARED , MAP_PRIVATE必选其一,而MAP_FIXED则不推荐使用。

offset参数一般设为0,表示从文件头开始映射。
参数addr指定文件应被映射到进程空间的起始地址,一般被指定一个空指针,此时选择起始地址的任务留给内核来完成。
函数的返回值为最后文件映射到进程空间的地址,进程可直接操作起始地址为该值的有效地址。

/dev/mem

https://cloud.tencent.com/developer/article/1543163
https://blog.csdn.net/xiaohuima_dong/article/details/44657917

/dev/mem是linux下的一个字符设备,源文件是~/drivers/char/mem.c,这个设备文件是专 门用来读写物理地址用的。里面的内容是所有物理内存的地址以及内容信息。通常只有root用户对其有读写权限。

简单来讲,/dev/mem是系统物理内存的映像文件,这里的 “物理内存” 需要进一步解释。

物理内存是指我们插在内存槽上的内存条吗?当然是,但物理内存不单单指内存条。

物理内存严格来讲应该是指 物理地址空间 ,内存条只是映射到这个地址空间的一部分,其余的还有各种PCI设备,IO端口等。

[root@localhost mem]# cat /proc/iomem
00000000-00000fff : reserved
00001000-0009fbff : System RAM
0009fc00-0009ffff : reserved
000c0000-000c7fff : Video ROM
000e2000-000ef3ff : Adapter ROM
000f0000-000fffff : reserved
000f0000-000fffff : System ROM
00100000-31ffffff : System RAM
01000000-01649aba : Kernel code
01649abb-01a74b7f : Kernel data
01c13000-01f30fff : Kernel bss
32000000-33ffffff : RAM buffer
3fff0000-3fffffff : ACPI Tables
e0000000-e0ffffff : 0000:00:02.0
e0000000-e0ffffff : vesafb
f0000000-f001ffff : 0000:00:03.0
f0000000-f001ffff : e1000
...
...

其中,只有RAM才是指内存条。关于物理地址空间的详细情况,请参考E820相关的资料。
明白了物理内存的构成之后,我们来看看/dev/mem里有什么。事实上,它就是一个活着的Linux系统实时映像,所有的进程taskstruct结构体,sock结构体,skbuff结构体,进程数据等等都在里面的某个位置:
tu
/dev/mem是一个动态的内存映像

/dev/mem是整个系统内存映像时,我们就知道整个系统的所有数据结构都在里面可以被找到,当然也包括进程链表

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值