linux文件操作之系统调用

标签: linux 文件 系统调用 | 发表时间:2011-09-17 15:49 | 作者:马哈鱼 L
出处:http://www.cnblogs.com/

    在linux中,一切都是文件,文件为操作系统服务和设备提供了一个简单而统一的接口,这就意味者程序可以像使用文件那样使用各种设备。大多数情况下对于文件的操作只用到open,write,lseek,read,close五个系统调用。本文通过一个简单的例子来介绍这五个调用及关联内容。

    先看例子:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<string.h>

int
main( void )
{
  int file_des = open( "my_file.txt", O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR | S_IXUSR | S_IXOTH );
 
  char *write_buf = "zhujiangfeng\n";
  if ( write( file_des,write_buf, strlen( write_buf )) != strlen( write_buf ) )
  {
    write( STDERR_FILENO, "WRITE ERROR!\n", 13 );
    exit( 0 );
  }

  if ( lseek( file_des, 4, SEEK_END ) == -1 )
  {
    write( STDERR_FILENO, "SEEK ERROR!\n", 11 );
    exit( 0 );
  }
  write( file_des, "AAAAAA", 6 );

  lseek( file_des, 0, SEEK_SET );
  char read_buf[50];

  if ( read( file_des, read_buf, 50 ) == -1 )
  {
    write( STDERR_FILENO, "READ ERROR!\n", 12 );
    exit( 0 );
  }
  write( STDOUT_FILENO, read_buf, 50 );

  close( file_des );
  exit( 1 );
}
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  这是一个简单的读写文件的例子,先创建一个文本文件,写入一些内容,再把文本内容输出到标准输出,下面开始分析这个例子:
  1 int file_des = open( "my_file.txt", O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR | S_IXUSR | S_IXOTH );
    以读写方式打开一个新建文件 my_file.txt,指定其访问权限为 文件属主具有读,写,执行权限,组用户没有任何权限,其他用户只有执行权限。

    open调用用于创建或打开文件,返回一个文件描述符。
    #include<fcntl.h>
    #include<sys/stat.h>
    #include<sys/types.h>
    int open( const char *path, int oflags );
    int open( const char *path, int oflags, mode_t mode );

    第一个oen用于打开已有的文件,第二个open用于创建新文件。
    (1)oflags参数说明了文件的打开方式,值为以下一个或多个常量的“或”运算(这些常量定义在<fcntl.h>):
    O_RDONLY 只读打开
    O_WRONLY 只写打开
    O_RDWR   读,写打开
    以上常量为必选,且只能选一个,下列常量为可选:
    O_APPEND 在文件尾端追加
    O_TRUNC  将文件长度截短为0
    O_CREATE 若文件不存在,按照参数mode指定的访问权限创建
    O_EXCL   测试要创建的文件是否存在,和O_CREATE一起使用,使得文件的测试和创建是一个院子操作
    (2)mode参数指定了新建文件的访问权限,值为以下一个或多个标识的“或”运算(这些标识定义在<sys/stat.h>):
    S_IRUSR  文件属主具有读权限
    S_IWUSR  文件属主具有写权限
    S_IXUSR  文件属主具有执行权限
 
    S_IRGRP  文件所属组具有读权限
    S_IWGRP  文件所属组具有写权限
    S_IXGRP  文件所属组具有执行权限

    S_IROTH  其他用户具有读权限
    S_IWOTH  其他用户具有写权限
    S_IXOTH  其他用户具有执行权限
    注:mode参数实际上是设置文件访问权限的请求,该请求是否被允许取决于此时umask的设置。
    (3)如果两个程序同时打开同一个文件,会得到两个不同的文件描述符。如果都进行写操作,他们的数据将会相互覆盖,而不是交织在一起。两个文件对读写的起始位置(偏移值)也有各自的理解。文件锁可以防止此情况的发生,以后将会提到这个概念。

    2 write( file_des,write_buf, strlen( write_buf )) != strlen( write_buf )
     将缓冲区write_buf中的所有字节写入与文件描述符file_des关联的文件中,并且判断是否成功写入。

    #include<unistd.h>
    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<unistd.h>
     #include<sys/types.h>
     off_t lseek( int file_des, off_t off_set, int whence );
     lseek用于设置文件的读写偏移量,返回新的读写偏移量。

     (1)off_t是一个与具体实现有关的类型,定义在<sys/types.h>中;
     (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分别对应程序的标准输入,标注输出,标准出错。这些常量定义在<unistd.h>中。

    4  #include<unistd.h>
       int close( int file_des );
       终止文件描述符file_des与对应文件的关联。

       (1)文件描述符被释放并重新利用;
      (2)文件关闭后,进程还会释放加在文件上的所有记录锁;
      (3)进程终止后,内核会自动关闭所有打开的文件。

    5 其他与文件有关的系统调用
      (1)#include<unistd.h>
          #include<sys/stat.h>
          #include<sys/types.h>
          int fstat( int file_des, struct stat *buf );
          int stat( const char *path, struct stat *buf );
          int lstat( const char *path, struct stat *buf );
       这三个系统调用用于获取文件的信息并填充在struct stat中,成功返回0,出错返回-1。当path指向的对象是符号链接时,stat返回的是该链接指向的文件的信息,而lstat返回的是该链接的信息。这三个系统调用将在以后作为一个专题来讨论。
      (2)#include<unistd.h>
          int dup( int file_des );
          int dup2( int file_des, int file_des2 );
        dup系统调用复制文件描述符file_des,返回一个新的最小值的可用文件描述符。通过两个或多个文件描述符可以实现在文件的不同位置读写数据。dup2明确指定将file_des复制为file_des2。这在通过管道进行进程间通信时很有用。

作者: 马哈鱼 发表于 2011-09-17 15:49 原文链接

评论: 1 查看评论 发表评论


最新新闻:
· 英特尔被ARM挤出移动产品市场 或明年发力(2011-09-18 08:23)
· 乔布斯咬了上帝的苹果(2011-09-18 08:21)
· 中国移动互联网业的所罗门之路:赢在“云”端(2011-09-18 08:20)
· 考拉盒子:儿童应用精品聚集地(2011-09-18 00:26)
· 小鬼子的虚拟体感装置,让你体会被刺穿的感觉(2011-09-18 00:25)

编辑推荐:TechEd社区之夜暨博客园北京俱乐部活动报名

网站导航:博客园首页  我的园子  新闻  闪存  小组  博问  知识库

相关 [linux 文件 系统调用] 推荐:

linux文件操作之系统调用

- L - 博客园-首页原创精华区
    在linux中,一切都是文件,文件为操作系统服务和设备提供了一个简单而统一的接口,这就意味者程序可以像使用文件那样使用各种设备. 大多数情况下对于文件的操作只用到open,write,lseek,read,close五个系统调用. 本文通过一个简单的例子来介绍这五个调用及关联内容.   这是一个简单的读写文件的例子,先创建一个文本文件,写入一些内容,再把文本内容输出到标准输出,下面开始分析这个例子:.

linux strace - 追踪系统调用

- - Linux - 操作系统 - ITeye博客
有时候发现有个别进程占用了大量CPU或者内存,我们可以查看进程的调用情况. 已有 0 人发表留言,猛击->> 这里<<-参与讨论. —软件人才免语言低担保 赴美带薪读研.

Linux系统调用过程分析

- - CSDN博客架构设计推荐文章
《Linux内核设计与实现》. linux的系统调用过程:. 用户程序------>C库(即API):INT 0x80 ----->system_call------->系统调用服务例程-------->内核程序. 先说明一下,我们常说的用户API其实就是系统提供的C库. 系统调用是通过软中断指令 INT 0x80 实现的,而这条INT 0x80指令就被封装在C库的函数中.

Linux 中用 strace 追踪系统调用和信号值

- - 博客园_iTech's Blog
原文地址: http://www.dbabeta.com/2009/strace.html. 打开man strace,我们能看到对strace的最简洁的介绍就是”strace – trace system calls and signals”. 实际上strace是一个集诊断、调试、统计与一体的工具,我们可以使用strace对应用的系统调用和信号传递的跟踪结果来对应用进行分析,以达到解决问题或者是了解应用工作过程的目的.

Linux 文件结构

- Shiina Luce - OSMSG
想了解 Linux 文件系统树形结构,却又不愿翻阅 FHS 的朋友,可以参考 skill2die4 制作的这张简图. 此图算是 FHS 的图形化版本,简要的说明了 Linux 系统中各个目录的用途及层级关系,适合初学者使用参考. 不过其中较新的如 /run 目录并未在其中出现. 做为参考,这是 Fedora 16 Beta i686 上的文件结构:.

Linux 2.6 中的文件锁

- Mountain - 小程序员的草稿箱
在多任务操作系统环境中,如果一个进程尝试对正在被其他进程读取的文件进行写操作,可能会导致正在进行读操作的进程读取到一些被破坏或者不完整的数据;如果两个进程并发对同一个文件进行写操作,可能会导致该文件遭到破坏. 因此,为了避免发生这种问题,必须要采用某种机制来解决多个进程并发访问同一个文件时所面临的同步问题,由此而产生了文件加锁方面的技术.

Linux 文件结构 — LinuxTOY

- oak - linuxtoy.org
想了解 Linux 文件系统树形结构,却又不愿翻阅 FHS 的朋友,可以参考 skill2die4 制作的这张简图. 此图算是 FHS 的图形化版本,简要的说明了 Linux 系统中各个目录的用途及层级关系,适合初学者使用参考. 不过其中较新的如 /run 目录并未在其中出现.

linux下的文件系统选型

- Michael - shell&#39;s home
    贝壳原来一直认为文件系统可以随便选,结果最近吃了两次苦头. 一个是btrfs对虚拟机支持不良,另一个是特定情况下xfs性能比ext3高20倍. 痛定思痛,打算列一下文件系统选型的方法和依据,欢迎拍砖.     下面我列一下纳入参考的文件系统,当然,ntfs就不要出来搞基了,玩嵌入式/光盘live之类的朋友也不要来凑热闹了阿.

Linux 下的文件系统选型

- 桔子 - python.cn(jobs, news)
贝壳原来一直认为文件系统可以随便选,结果最近吃了两次苦头. 一个是btrfs对虚拟机支持不良,另一个是特定情况下xfs性能比ext3高20倍. 痛定思痛,打算列一下文件系统选型的方法和依据,欢迎拍砖. 下面我列一下纳入参考的文件系统,当然,ntfs就不要出来搞基了,玩嵌入式/光盘live之类的朋友也不要来凑热闹了阿.