学习linux系统相信大家一定知道一句话。。。一切皆文件。
我体会最深的就是在OPENWRT里面,很多路由器的参数都是通过文件的形式存储在文件系统中
其实Linux系统也是。因此。。。文件操作对学习Linux嵌入式编程来说还是很重要的
说句题外话:Linux内核的五个组成部分-》任务调度,进程间通信,文件系统,网络模块,内存管理
网络部分其实之前已经介绍了一些网络编程了,为什么先说网络编程呢
因为面试的特别喜欢问,实际用的也特比多
文件操作其实就是文件系统里面的一部分内容。
今天介绍的这些我们称之为系统调用。还有一种叫文件IO
系统调用和文件IO其实差不多,区别就是。。。
系统调用时系统的接口,可移植性没有文件IO好,频繁调用耗费系统资源
文件IO源于C库,只要有C库就可以用,可移植性强。
以下就是一些常用的系统调用文件操作的函数
1 int file_des =open( "my_file.txt", O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR | S_IXUSR | S_IXOTH );&nBSP; 以读写方式打开一个新建文件 my_file.txt,指定其访问权限为 文件属主具有读,写,执行权限,组用户没有任何权限,其他用户只有执行权限。
open调用用于创建或打开文件,返回一个文件描述符。
#include
#include
#include
int open( const char *path, int oflags );
int open( const char *path, int oflags, mode_t mode );
第一个oen用于打开已有的文件,第二个open用于创建新文件。
(1)oflags参数说明了文件的打开方式,值为以下一个或多个常量的“或”运算(这些常量定义在):
O_RDONLY 只读打开
O_WRONLY 只写打开
O_RDWR 读,写打开
以上常量为必选,且只能选一个,下列常量为可选:
O_APPEND 在文件尾端追加
O_TRUNC 将文件长度截短为0
O_CREATE 若文件不存在,按照参数mode指定的访问权限创建
O_EXCL 测试要创建的文件是否存在,和O_CREATE一起使用,使得文件的测试和创建是一个院子操作
(2)mode参数指定了新建文件的访问权限,值为以下一个或多个标识的“或”运算(这些标识定义在):
S_IRUSR 文件属主具有读权限
S_IWUSR 文件属主具有写权限
S_IXUSR 文件属主具有执行权限
S_IRGRP 文件所属组具有读权限
S_IWGRP 文件所属组具有写权限
S_IXGRP 文件所属组具有执行权限
S_IROTH 其他用户具有读权限
S_IWOTH 其他用户具有写权限
S_IXOTH 其他用户具有执行权限
注:mode参数实际上是设置文件访问权限的请求,该请求是否被允许取决于此时umask的设置。
(3)如果两个程序同时打开同一个文件,会得到两个不同的文件描述符。如果都进行写操作,他们的数据将会相互覆盖,而不是交织在一起。两个文件对读写的起始位置(偏移值)也有各自的理解。文件锁可以防止此情况的发生,以后将会提到这个概念。2write( file_des,write_buf, strlen( write_buf )) != strlen( write_buf )将缓冲区write_buf中的所有字节写入与文件描述符file_des关联的文件中,并且判断是否成功写入。
#include
size_t write( int file_des, const void *buf, size_t bytes );
(1)write的返回值可能会小于bytes,但这并不一定是个错误,需要检查全局变量errno来确定。
3 if (lseek( file_des, 4, SEEK_END ) == -1 )
{
write( STDERR_FILENO, "SEEK ERROR!\n", 11 );
exit( 0 );
}
将文件的读写偏移量推进到超过文件结尾4个字节处,如果失败,像标准输出输出错误信息。
#include
#include
off_t lseek( int file_des, off_t off_set, int whence );
lseek用于设置文件的读写偏移量,返回新的读写偏移量。
(1)off_t是一个与具体实现有关的类型,定义在中;
(2)whence的取值如下:
SEEK_SET 将文件的读写偏移量设置为距离文件开始处off_set个字节
SEEK_CUR 将文件的读写偏移量设置为当前值加上off_set,off_set可正可负
SEEK_END 将文件的读写偏移量设置为文件长度加上off_set,off_set可正可负
(3)当在超过文件尾端之后写入时,就会在文件中形成一个空洞。文件空洞并不占用磁盘空间,处理方式与文件系统的实现有关。可以用$od -c file 查看空洞文件的内容。
(4)STDIN_FILENO,STDOUT_FILENO,STDERR_FILENO分别对应程序的标准输入,标注输出,标准出错。这些常量定义在中。
4 #include
intclose( int file_des );
终止文件描述符file_des与对应文件的关联。
(1)文件描述符被释放并重新利用;
(2)文件关闭后,进程还会释放加在文件上的所有记录锁;
(3)进程终止后,内核会自动关闭所有打开的文件。