Linux系统下的文件I/O操作

来源:互联网 发布:考研调剂知乎 编辑:程序博客网 时间:2024/06/06 10:49

    在Linux系统中,外存中的数据和程序都是以文件的方式保存,甚至对目录和各种设备的操作也都等同于文件的操作。

    1.Linux系统文件的属性

     文件是指有名字的一组相关信息的集合。文件系统是操作系统用来管理和保存文件的。不同的文件系统的数据结构和管理程序是不同的,Linux操作系统支持多种不同的文件系统。Linux的文件系统属于树形结构。文件系统的开始是从根目录(/)开始,不同的文件系统可以挂载在根文件系统下的不同子目录下。

     Linux文件类型:普通文件、目录文件、符号链接文件、设备文件、管道文件、socket文件等。

     下面的程序列出相应目录下的文件信息

     

     

      函数原型 :int system(const char * string)

      函数传入值:系统变量

      函数返回值:执行成功则返回执行shell命令后的返回值,调用/bin/sh失败则返回127,其他失败原因则返回-1。

      用ls命令长列表显示文件类型

     命令作用普通文件权限的10个字符中的第一位是“-"的文件目录文件权限的10个字符中的第一位是"d"的文件硬链接文件除了显示的文件数量,其他都和某个普通文件一模一样的文件软链接文件权限的10个字符中的第一位是“l"的文件块设备文件权限的10个字符中的第一位是“b"的文件socket文件权限的10个字符中的第一位是“s"的文件字符设备文件权限的10个字符中的第一位是“c"的文件管道文件权限的10个字符中的第一位是“p"的文件setUid可执行文件权限的10个字符中的第四位是“s"的文件setGid可执行文件权限的10个字符中的第七位是“s"的文件setUid加setGid文件权限的10个字符中的第四位和第七位都是“l"的文件                     Linux系统是一个多用户系统,不同的用户访问同一文件可能有不同的权限,用户权限可以分为四种:可读取(Read)、可写入(Write)、可执行(execute)和无权限,分别可用r、w、x和-表示。

                     下面设计一个程序,把”/etc/passwd"文件权限设置成文件所有者可读可写,所有其他用户为只读权限。         

                        

                      设计一个程序,要求设置文件系统与目录的权限掩码

                      

                      

                       文件的权限 = 预设的文件权限- 权限掩码

                       函数chmod用来改变文件权限,它的函数原型为: int chmod(const * path,mode_t mode);根据参数mode权限来更改参数path指定文件的权限,权限更改成功返回0,失败则返回-1

                       mode参数说明如下:

                        参数:mode说明S_IRUSR拥有着具有读取权限S_IWUSR拥有着具有写入权限S_IXUSR拥有着具有执行权限S_IRGRP组具有读取权限S_IWGRP组具有写入权限S_IXGRP组具有执行权限S_IROTH其他用户具有读取权限S_IWOTH其他用户具有写入权限S_IXOTH其他用户具有执行权限                          umask函数说明:

                          所需头文件: #include<sys/types.h>  、#include<sys/stat.h>

                          函数功能:设置建立新文件时的权限掩码

                          函数原型:mode_t umask(mode_t mask)

                          函数传入值:4位八进制数

                          函数返回值:返回值为原先系统的umask值

                          注意:建立文件时,该文件的真正权限为0666-mask值;建立文件夹时,该文件夹的真正权限是0777-mask值

                          在linux系统中,通过定义stat结构体来存放文件的各种属性:

                          

struct stat{    dev_t st_dev;/*文件所在设备的ID*/    ino_t st_ino;/*索引节点号*/    mode_t st_mode;/*文件保护模式*/    nlink_t st_nlink;/*用户号,针对设备文件*/    uid_t st_uid;/*用户ID*/    gid_t st_gid;/*组ID*/    dev_t st_rdev;/*设备号,针对设备文件*/    off_t st_size;/*文件字节数*/    unsigned long st_bikesize;/*系统块的大小*/    unsigned long st_blocks;/*文件所占块数*/    time_t st_atime;/*最后一次访问时间*/    time_t st_mtime;/*最后一次修改时间*/    time_t st_ctime;/*最后一次改变时间(指属性)*/};
                          设计一个程序,应用系统函数stat获取"/etc/passwd"文件的大小

                            

                            stat函数说明:

                                  函数原型:int stat(const * file_name,struct stat *buf),将参数file_name所指的文件状态复制到参数buf所指的结构中,执行成功返回0,失败返回-1.

    2.不带缓存的文件I/O操作

         Linux系统把目录、设备等的操作,都等同于文件的操作。Linux系统通过文件描述符来区分和应用特定的文件。文件描述符是一个非负的整数,是一个索引值,指向内核中每个进程打开文件表。基于文件描述符的文件操作主要有:不带缓存的文件I/O操作和带缓存的文件流I/O操作。

          不带缓存的文件I/O操作主要用到下表中的函数

         函数作用creat创建文件open打开或创建文件close关闭文件read读文件write写文件lseek移动文件的读写位置flock锁定文件或解除锁定(用于文件加建议性锁)fcnd文件描述符操作(用于文件加强制性锁)             使用creat函数创建文件

             

              函数原型 int creat(const char * pathname,mode_t mode);函数的两个参数分别用来建立文件的访问路径和设置新增文件的权限,正确返回0,错误则返回-1

              使用open函数打开一个文件,如果文件不存在则创建一个文件,使用close函数关闭文件

             

                          文件的读写操作:

                           read函数用于在指定的文件描述符中读出数据,write函数用于向打开的文件写数据,写数据从文件当前位置开始。seek函数用于在指定的文件描述符中将文件指针定位到相应的位置。

                           下面的程序从终端读数据再写会到终端

                           

                            下面的程序利用read函数读取"/etc/passwd"的内容,然后使用write函数写到目标文件中

                            

                            

                             下面的程序打开当前终端文件/dev/tty,在打开时指定O_NONBLOCK标志。程序运行每隔6秒等待用户从终端输入,等待30秒,30秒后程序继续执行主程序,输出图形结束。

                             

                             

                             可以使用fcntl函数改变一个已打开文件的属性,可以重新设置读、写、追加、非阻塞等标志,使用函数fcntl通过F_GETFL,F_SETFL可以分别用于读取、设置文件的属性,能够更改的文件标志有O_APPEND,O_ASYNC,O_DIRECT,O_NOATIME和O_NONBLOCK.

                              

                             

                             

                              Linux是多用户操作系统,当多个用户对同一文件操作时,就需要给文件加锁,锁分为建议性锁和强制性锁。给文件加建议性锁的是flock函数,给文件加强制性锁的是fcntl函数。

                               下面的程序先用open函数打开(创建)文件“locfile”;接着调用自定义函数lock_set:先传递参数“F_WRLCK"给该文件加锁,并打印输出给文件加锁进程的进程号,然后先传递参数”F_UNLCK“给文件解锁,并打印输出给文件解锁进程的进程号;在自定义函数lock_set给文件上锁语句前,加上判断文件是否上锁的语句,如果文件已经上锁,打印输出给文件上锁进程的进程号。

                              

                              

                              

                              int flock(int id,int operation),函数用于锁定文件或解除锁定(用于文件夹建议性锁),而函数fcntl用于给文件加强制性锁,成功返回0,失败返回-1

    3.带缓存的流文件I/O操作

                              带缓存的 流文件I/O操作,是在内存开辟一个“缓存区”,为程序的每一个文件使用。当执行读文件操作时,从磁盘文件将数据先读入内存“缓冲区”,装满后再从内存“缓冲区”依次读入接受的变量。当执行写文件操作时,先将数据写入内存“缓存区”,待内存“缓存区”装满后再写入文件。

                               带缓存的文件I/O操作主要用到的函数:

                              函数作用fopen打开或创建文件fclose关闭文件fgetc由文件读取一个字符fputc将一指定字符写入文件流中fgets由文件中读取一字符串fputs将一指定的字符串写入文件内fread从文件流成块读取数据fwrite将数据成块的写入文件流fseek移动文件流的读写位置rewind移动文件流的读写位置为文件开头ftell取得文件流的读取位置                                带缓存的流文件I/O操作,是基于输入输出(IO)流机制的文件操作,又叫做文件流(File Stream)的操作。

                               带缓存的基于输入输出流机制的文件操作时,打开文件用fopen函数,关闭文件用fclose函数。

                              

                              带缓存的基于输入输出流机制的文件操作时,读字符用fgetc函数,写字符用fputc函数

                             

                               带缓存的基于输入输出流机制的文件操作时,读字符串用fgets函数,写字符串用fputs函数

                              

                               下面的fwrite2程序把三个人的姓名和账号月信息通过一次流文件I/O操作写入文件testfwrite中,而程序fread负责读取文件信息。把快信息写入文件用fwrite函数,从文件读取信息用fread函数。

                              

                             

                              函数功能:将数据写入到文件流

                              函数原型:size_t fwrite(const void * ptr,size_t size,size_t nmemb,FILE * stream);

                              函数传入值:ptr:欲写入的数据地址         size:字符串长度        nmemb:字符串数目  stream:一个文件流 

                              函数返回值:成功则返回实际写入的nmemb数目,失败则返回EOF

                              函数功能:从文件流读取数据

                              函数原型:size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream);

                              函数传入值:ptr:从文件读取的内容存放到ptr所指的内存首地址         size:字符串长度        nmemb:字符串数目  stream:一个文件流

                              函数返回值:成功则返回实际写入的nmemb数目,失败则返回EOF

                            下面的程序先调用fseek函数定位到距文件开头SEEK_SET位移量为10,调用ftell函数取得文件流的偏移量并输出,然后调用fseek函数定位到距文件结尾SEEK_END位移量为0,调用ftell函数取得文件流的偏移量并输出;最后调用rewind函数重设文件流的读写位置为文件开头,调用ftell函数取得文件流的偏移量并输出。

                             

    4.特殊文件的操作

                            目录文件的操作:

                             opendir函数:打开目标文件

                             readdir函数:读取目录文件

                             closedir函数:关闭目录文件

                             下面的程序打印系统目录“/etc/rc.d"中的所有的目录结构

                             

                             下面的程序要求用递归的方法列出某一目录下的全部文件的大小和文件夹及创建日期,包括子文件和子文件夹。

                             

                            

                            

                            

                             链接文件的操作:symlink函数用于建立软链接

                             

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 九州娱乐提款未到账怎么办 法院拍卖后不足的余款怎么办 购车后余款没拿怎么办? 抵押房屋被执行后余款怎么办 苏宁无敌券过期怎么办 被亚马逊自营跟卖怎么办 苏宁易购绑定手机后解绑不了怎么办 手机qq注册号码忘了怎么办 原创头条号被限制推荐了怎么办 为什么打开app有广告怎么办 苹果手机浏览器总是弹出广告怎么办 手机上打开页面出现广告怎么办 电脑下面的任务栏变宽了怎么办 酷派手机总是出现广告怎么办 电脑弹出的热点新闻关闭不了怎么办 京东老是弹广告怎么办 电脑右下角出现无法显示网页怎么办 电脑右下角广告关不了怎么办 qq邮箱被冻结了怎么办 手机qq群自动发广告怎么办 济宁学院考研和上课冲突怎么办 考研但是大四上课多怎么办 试管促排卵泡少怎么办 京东退货卖家拒收怎么办 京东退货被卖家拒收怎么办 期货平台跑路了怎么办 浮云牧场没房了怎么办 融资股票停牌了怎么办 买入的股票停牌怎么办 淘宝抢到便宜货老板不发货怎么办 微信代购买到假货了怎么办 微信代购收到假货怎么办 苹果商店下载很慢怎么办 谷歌商店下载东西慢怎么办 买家说少发货了怎么办 人肉代购被海关扣了怎么办 韩国代购被海关扣了怎么办 爱奇艺开通自动续费忘了账号怎么办 小米手机云储存空间不足怎么办 路由器被黑了打不开网页怎么办 致人轻伤跑了怎么办