内核中针对proc文件系统的编程函数总结
已有 54438 次阅读 20xx-10-11 19:08 |个人分类:Linux kernel|关键词:proc 内核 函数
一、头文件:
#include <linux/proc_fs.h>
二、创建与删除proc文件:
<一>创建普通文件:
1.创建不可读写的普通文件
/*此函数只负责在proc中创建一个只读文件,即能在proc中看到这个文件。 * */
struct proc_dir_entry* create_proc_entry (const char *name,mode_t mode,struct proc_dir_entry *parent);
@name :要创建的文件名
@mode :要创建的文件的属性 默认0755
@parent :这个文件的父目录
2.创建只读的普通文件
/*和create_proc_entry基本一样。
* 只是为该文件挂接上读函数:read_proc(void data);
* */
struct proc_dir_entry * create_proc_read_entry (const char *name,mode_t mode,struct proc_dir_entry *parent,read_proc_t* read_proc,void *data);
@name :要创建的文件名
@mode :要创建的文件的属性 默认0755
@parent :这个文件的父目录
@read_proc :当用户读这个文件时,内核调用的函数
@data :传给read_proc的参数
3.创建符号连接
/*该函数在父目录parent下创建一个指向dest的连接name。 * 就像ln:
* #ln -s dest parent/name
* */
struct proc_dir_entry * proc_symlink (const
proc_dir_entry *parent,const char *dest);
@name :要创建的文件名
@parent :这个文件的父目录
@dest :符号连接的目标文件
4.创建目录
/*该函数在父目录parent下创建一个目录name char *name,struct
* */
struct proc_dir_entry * proc_mkdir (const char *name,struct proc_dir_entry *parent);
@name :要创建的目录名
@parent :这个目录的父目录
5.删除文件或目录
/*这个函数从proc文件系统中删除一个文件或目录。
* 注意:1。是通过参数name,而不是通过创建时返回的指针来删除的。 * 2。该函数不会递归删除目录下的文件。
* 3。data变量保存了分配的内存,要先释放对应内存,再删除该文件。 * */
void remove_proc_entry (const char *name,struct proc_dir_entry *parent); @name :要删除的文件或目录名
@parent :所在的父目录
<二>、读写proc文件
为了能让用户读写添加的proc文件,需要挂接上读写回调函数:read_proc和write_proc
例:
struct proc_dir_entry * entry;
entry->read_proc = read_proc_foo;
entry->write_proc = write_proc_foo;
1.读函数read_func
/*该函数把要写的信息写入buffer,最多不超过PAGE_SIZE
* */
int read_func (char *buffer,char **stat,off_t off,int count,int *peof,void *data);
@buffer :把要返回给用户的信息写在buffer里,最大不超过PAGE_SIZE(一般4K)
@stat :一般不使用
@off :buffer的偏移量
@count :用户要取的字节数
@peof :读到文件尾时,把peof指向的位置置1
@data :被多个proc文件定义为读时,通过data传递参数
2.写函数write_func
/*该函数最多从buffer中读取count个字节的数据。
* 注意:buffer地址在用户空间,需要先用copy_from_user()把这些数据拷贝到内核中。
* */
int write_func (struct file *file,const char *buffer,unsigned long count,void *data);
@file :该proc文件对应的file结构,一般忽略。
@buffer :待写的数据所在的位置
@count :待写数据的大小
@data :同read_func
<三>、seq_file编程接口
include/linux/seq_file.h:
struct seq_file{
char *buf;
size_t size;
size_t from;
size_t count;
loff_t index;
loff_t version;
struct semaphore sem;
struct seq_opertions *op;
void *private;
};
seq_file结构会在seq_open函数调用中分配,然后作为参数传给每一个seq_file的操作函数。
1.seq_file操作函数:
struct seq_operations {
void (*start) (struct seq_file *m,loff_t *pos);
void (*stop) (struct seq_file *m,void *v);
void (*next) (struct seq_file *m,void *v,loff_t *pos);
void (*show) (struct seq_file *m,void *v);
};
2.四个操作函数作用:
start:用来遍历连接对象的时候做初始化准备工作。
从pos得到偏移,返回一个连接对象的偏移。
也可以返回一个特殊值:SEQ_START_TOKEN
出错返回:ERR_PTR(error_code)
stop:遍历结束时被调用。
主要做一些清理工作,如释放锁、释放内存
注意:如果调用了start,就必定会调用stop,即使start返回出错。 next:遍历中寻找下一个连接对象。一般是下一个节点。
show:对当前遍历到的连接对象或节点进行一些操作。
例如调用seq_xxx函数输出对象的一些内容。
3.格式化输出函数
seq_printf(struct seq_file *m,"格式化字符串",var):和printk很相似,只是多了个*m
seq_putc (struct seq_file *m,char c);输出字符
seq_puts (struct seq_file *m,const char *s);输出字符串
seq_escape (struct seq_file *m,const char *s,const char *esc);跟seq_puts类似,不同的是这个函数特殊处理字符串s中的特殊字符(esc指针指向的每个字符),这些特殊字符输出为八进制,其他字符照常。
文件目录函数库:
一、文件常用操作
1. file_exists():检查文件或目录是否存在
语法:boolfile_exists($filename),如果文件或目录存在,返回true,否则返回false
2. is_readable():检查文件是否可读
语法:boolis_readable($filename),如果文件可读,返回true,否则返回false
3. is_writable():检查文件是否可写
语法:boolis_writable($filename),如果文件可写,返回true,否则返回false
4.is_executable():检查文件是否可执行
语法:boolis_executable($filename)
5.is_file():判断是否是一个文件
语法:boolis_file($filename)
6.filesize():得到文件的大小
语法:intfilesize($filename),返回文件的大小,单位为bytes,如果出错返回false
7. filetype():得到文件的类型 语法:string filetype($filename),返回文件的类型 windows中返回为file/dir/unknown三种类型 8. filectime():得到文件的创建时间 语法:intfilectime($filename),返回文件的创建时间,以时间戳形式返回 9. filemtime():得到文件的修改时间 语法:intfilemtime($filename),返回文件上次被修改的时间,以时间戳形式返回 10. fileatime():得到文件的上次访问时间 语法:intfileatime($filename),返回文件上次被访问的时间,以时间戳的形式返回 11. fileowner():取得文件的所有者 语法:intfileowner($filename),返回文件的所有者,返回文件所有的用户id 12. filegroup():取得文件的组 语法:intfilegroup($filename),返回文件所属组的id 13. fileperms():取得文件的权限 语法:intfileperms($filename),返回文件的访问权限
如何去记住这些函数,小窍门。
首先给你一个文件,你是不是先要看看这个文件存不存在啊,通过函数
file_exists($filename)来检查下,如果存在你在看看这个文件是否可读、可写、可执行啊,通过函数is_readable($filename)判断可读,通过函数is_writable($filename)判断可写,通过函数is_executable($filename)判断是否可执行,再看看是不是一个文件通过is_file($filename)来查看,接着我们再看看个文件的大小通过filesize($filename),返回的字节我们还可以通过我们自定义的函数转换为相应的B、MB、GB等,接着看看文件的类型,通过filetype($filename),看看文件什么时间创建的通过filectime($filename),看看文件什么上一次被修改的时间
filemtime($filename),看看文件最后一次被访问的时间fileatime($filename),他们返回的都是时间戳啊,我们不认识可以通过date函数转换一下我们就认识了,接着在看看这个文件的所有者啊,所属组啊,文件的权限啊,通过fileowner($filename)看所有者,通过
filegroup($filename)看所属分组,通过fileperms($filename)取得文件的权限,如果这些文件函数出错了,都返回false,接着你都查看完了你是不是可以对这个文件进行操作了。
14.touch($filename):创建文件
语法:bool touch($filename),创建成功返回true,失败返回false
15.unlink($filename):删除文件
语法:bool unlink($filename),删除文件,成功返回true,失败返回false
16.rename($oldName,$newName):重命名文件
语法:bool rename($oldName,$newName),成功返回true,失败返回false
他也可以移动文件,相当于剪切的作用
17.copy():拷贝文件
语法:bool copy($source,$dest),成功返回true,失败返回false
他相当于复制的作用
注意:
如果目标文件已经存在,那么将会产生覆盖的效果。
首先如果文件不存在我们可以创建一个文件,通过touch($filename)来创建,创建之后我们可以删除这个文件,通过unlink($filename)来删除。
创建文件之后,我发现文件名不好听,我想重命名文件通过rename($filename)
18.fopen():打开文件或者URL
resourcefopen($filename,$mode)
$mode的值可以为:
r:只读方式打开,将文件指针指向文件头
r+:读写方式打开,将文件指针指向文件头
w:写入方式打开,将文件指针指向文件头并将文件大小截为0.如果文件不存在则尝试创建
他。
w+:读写方式打开,将文件指针指向文件头并将文件大小截为0.如果文件不存在则尝试创建他。
a:写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建他。
a+:读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建他。
x:创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则fopen()调用失败并返回FALSE,并生成一条E_WARNING级别的错误信息。如果文件不存在则尝试创建之 x+:创建并以读写方式打开,将文件指针指向文件头。如果文件已存在,则fopen()调用失败并返回FALSE,并生成一条E_WARNING级别的错误信息。如果文件不存在则尝试创建之。
19.fwrite():写入文件,fputs()是fwrite的别名
语法:intfwrite($handle,$string[$length]),把$string写入文件指针$handle处。如果指定了$length,当写入了$length个字节或者写完了$string以后,就会停止。返回写入的字符数。
20.fread():读取文件
语法:string fread($handle,$length),读取一个打开的文件,从文件指针$handle读取最多$length个字节。
21.fgets():从文件指针中读取一行
语法:string fgets($hanlede[$length]),从$handle指向的文件中读取一行并返回长度最多为$length-1字节的字符串。碰到换行符、EOF或者已经读取了$length-1字节后停止。
22.fgetss():从文件指针中读取一行并过滤掉HTML标记
语法:string fgetss($handle[$length[,$allowable_tags]]),和fgets()相同,只除了fgetss尝试从读取的文本中去掉任何 HTML 和 PHP 标记。可以用可选的第三个参数指定哪些标记不被去掉。
23.fgetc():从文件中读取字符
语法:string fgetc($handle),返回一个包含有一个字符的字符串,该字符从$handle指向的文件中得到。碰到EOF则返回false。
24.feof():测试文件指针是否到了文件结束的位置
语法:boolfeof($handle),如果文件指针到了EOF或者出错时则返回TRUE,否则返回一个错误,其它情况返回false。
25.file():将整个文件读入一个数组
语法:array file($filename),数组中的每个单元都是文件中相应的一行,包括换行符在内。失败返回false
26.readfile():输出一个文件
语法:intreadfile($filename)
27.ftell():返回文件指针读写的位置
语法:intftell($handle),返回由$handle指定的文件指针的位置。
28.fseek():在文件指针中定位
语法:intfseek($handle,$offset),设置指针的位置。成功则返回 0;否则返回 -1。注意移动到 EOF 之后的位置不算错误。
29.rewind():倒会文件的指针
语法:bool rewind($handle),将$handle的文件位置设为文件流的开头。
如果将文件以附加("a" 或者 "a+")模式打开,写入文件的任何数据总是会被附加在后面,不管文件指针的位置。
30.fclose():关闭一个已经打开的文件指针
语法:boolfclose($handle)
31.file_get_contents():将整个文件读入一个字符串
语法:stringfile_get_content($filename)
32.file_put_contents($filename,$data):将一个字符串写入文件
语法:intfile_put_contents($filename,$data),$data可以为一维数组,相当于
file_put_contents($filename,join(“”,$array))
文件创建好了,我们可以通过什么方式来打开这个文件,通过fopen($filename,$mode)只是打开文件的方式不同,文件指针的位置不同,打开之后就可以做一些操作了,可以读取一个文件通过fread($filename,$length),读取多少个字符,也可以读取一行通过
fgets($filename,$length)也可以指定读取一行中$length个字符,也可以通过
fgetss($filename,$length,$allowable_tags)读取文件并过滤其中的HTML标记,也可以通过$allowable_tags去指定可以保留的标记,和strip_tags函数相似,接着你也可以一个字符一个字符的读,通过fgetc($filename),只要不到文件的末尾或者不碰到EOF就能读出来,怎么知道到没到文件的末尾或者EOF啊,可以通过feof($handle)来检测一下,如果到了EOF或者文件出错返回true,不到返回False。也可以通过ftell($handle)告诉你文件指针所在位置,也可以通过fseek($handle,$offset)指定指针位置,也可能够rewind($handle)重置指针位置。通过readfile($filename)将文件内容全部读出来,并输出;也可以通过file($filename)函数将文件中的行读到一个数组中,返回这个数组。也可以将文件中的内容通过
file_get_contents($filename)读到字符串中返回。我们不只可以读,还可以写啊,通过fwrite($handle,$string[$length])将$string写入文件,也可以写入$length个字符,或者通过fputs()函数一样,他是fwrite函数的别名,也可以通过file_put_contents($filename,$data)将$data数据写入文件。最后写完了之后都要关闭一下把,通过fclose($handle)将文件指针关闭掉。
其实file_get_contents($filename)和file_put_contents($filename,$data)这两个函数比较方便,因为file_get_contents($filename)相当于你先以读的方式打开文件,在将文件中的内容通过读的函数全部读出来,在关闭文件指针这三部的一个总结,用这一个函数就出来了;而
file_put_contents($filename,$data)也是,你相当于先以写的方式打开一个文件,如果之前这个文件存在内容,首先将内容清空,之后通过写的函数将内容写进去,最后关闭文件指针。
目录函数库:
1. is_dir():判断给定的文件是否是一个目录
语法:is_dir($filename),如果是目录返回true
2. dirname():返回路径中的路径目录部分
语法:stringdirname($path)
3. basename():返回路径中的文件名部分
语法:stringbasename($path)
4. pathinfo():返回文件的路径信息
语法:arraypathinfo($path);
5. opendir():打开目录句柄
语法:resourceopendir($path)
6. readdir():从目录句柄读取条目
语法:string readdir($handle),返回目录中下一个文件的文件名。
7. closedir():关闭目录句柄
语法:closedir($handle)
初中数学函数总结形如y=kx(k为常数,且k不等于0),y就叫做x的正比例函数。图象做法:1。带定系数2。描点3。连线图象是一条直…
大成培训(函数总结归纳)一:会求函数的定义域值域。二:知道函数奇偶性的相关性质。三:会求函数的导数和用导数解决相关问题,会解含x3…
1.概述函,即信函,或称书信。公函,即处理公务所用的书信。公函是党政机关、人民团体、企事业单位间商洽和联系工作时使用的一种文体。公…
公文函格式范文公文函概念函,即信;公函即公务信件。它是高低级和平行机关或不相附属机关之间在商洽和接洽工作、询问和答复问题时所应用的…
回复函格式及范文1、概述答复即复函,属公函的一种。复函是机关、单位为答复来函一方面商洽、询问或联系事宜而使用的一种公文,既可用于上…