linux常用系统接口
mprotect
mprotect()函数可以修改调用进程内存页的保护属性,如果调用进程尝试以违反保护属性的方式访问该内存,则内核会发出一个SIGSEGV信号给该进程。
#include <sys/mman.h> int mprotect(void *addr, size_t len, int prot); addr:修改保护属性区域的起始地址,addr必须是一个内存页的起始地址,简而言之为页大小(一般是 4KB == 4096字节)整数倍。 len:被修改保护属性区域的长度,最好为页大小整数倍。修改区域范围[addr, addr+len-1]。 prot:可以取以下几个值,并可以用“|”将几个属性结合起来使用: 1)PROT_READ:内存段可读; 2)PROT_WRITE:内存段可写; 3)PROT_EXEC:内存段可执行; 4)PROT_NONE:内存段不可访问。 返回值:0;成功,-1;失败(并且errno被设置) 1)EACCES:无法设置内存段的保护属性。当通过 mmap(2) 映射一个文件为只读权限时,接着使用 mprotect() 标志为 PROT_WRITE这种情况就会发生。 2)EINVAL:addr不是有效指针,或者不是系统页大小的倍数。 3)ENOMEM:内核内部的结构体无法分配。
以上内容摘自qiu.s.z的博客。
sysconf
使用 sysconf() 函数确定可配置的系统变量的值。sysconf() 返回选项 (变量) 的当前值,这个值可配置的但也是受系统限制的。在成功完成的情况下,sysconf() 返回变量的当前值。该值受到的限制将少于编译时 <limits.h>, <unistd.h> 或 <time.h> 中可用的对应值。大多数这些变量的值在调用进程的生存时间内不变。
#include <unistd.h> long sysconf ( int name);
#include<stdio.h> #include<unistd.h> int main(void) { long num_procs, page_size,num_pages,free_pages; num_procs = sysconf (_SC_NPROCESSORS_CONF); printf ( " CPU 个数为: %ld 个\n " , num_procs); page_size = sysconf (_SC_PAGESIZE); printf ( " 系统页面的大小为: %ld K\n " , page_size / 1024 ); num_pages = sysconf (_SC_PHYS_PAGES); printf ( " 系统中物理页数个数: %ld 个\n " , num_pages); free_pages = sysconf (_SC_AVPHYS_PAGES); printf ( " 系统中可用的页面个数为: %ld 个\n " , free_pages); }
以上内容摘自ketvin2011victory的博客。
syslog
Linux C中提供一套系统日记写入接口,包括三个函数:openlog,syslog和closelog。
调用openlog是可选择的。如果不调用openlog,则在第一次调用syslog时,自动调用openlog。调用closelog也是可选择的,它只是关闭被用于与syslog守护进程通信的描述符。
\#include //头文件 void openlog (char*ident, int option, int facility); void closelog(); void syslog(int priority, char*format,……);
var/log/dmesg 内核引导信息日志 /var/log/message 标准系统错误信息日志 /var/log/maillog 邮件系统信息日志 /var/log/cron 计划任务日志 /var/log/secure 安全信息日志 /var/log/syslog vpp日志
以上内容摘自[bitbit的博客](https://www.cnblogs.com/skyofbitbit/p/3674664.html)。
open
open可以打开文件,读取文件内容。特别的,读取一些特别的文件可以获取一些系统信息。
/proc/self/pagemap
通过读取里面的内容就可以算出当前虚拟地址对应的物理页,然后加入page_offset就可以知道当前虚拟地址对应的物理地址。