内核中针对proc文件系统的编程函数总结

内核中针对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指针指向的每个字符),这些特殊字符输出为八进制,其他字符照常。

 

第二篇:php常用文件函数总结

文件目录函数库:

一、文件常用操作

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)