底层文件访问:
    进程:运行中的程序,它有一些与值关联的文件描述符,有多少个文件描述符取决于系统配置情况。
    当一个程序开始运行时,一般会打开三个文件描述符:
        0:标准输入
        1:标准输出
        2:标准错误
        可以通过系统调用(open)把其他文件描述符与文件和设备相关联。
       
    write系统调用:
        作用:把缓冲区(buf)的前nbytes个字节写入与文件描述符(fildes)关联的文件。
        write返回实际写入的字节数,如果文件描述符有错误或者底层设备的驱动程序对数据长度比较敏感,表示在write调用中出现了
        错误,返回值可能会小于nbytes。如果函数返回0,表示未写入任何数据;返回-1表示write调用中出现了错误,错误代码保存在
        全局变量errno中。

    #include <stdio.h>
    #include <unistd.h>    // write调用原型所在的头文件
    int main(void)
    {
      if ( (write(, "Here is some data\n", )) != )
        write(, "A write error has occurred on file descriptor 1\n", );
      return ;
    }

        root@ubuntu:/home/linlin/linlin/c_code# ./simple_write.out
        Here is some data

write可能会报告写入的字节比要求的少,这不一定时错误,在程序中,需要检查errno以发现错误,然后再次调用write写入剩
    余数据
    
  read系统调用:
      作用:从文件描述符(fildes)相关联的文件里读入nbytes个字节的数据,并把它们放到数据区buf中。
      read返回实际读入的字节数,这可能会小于请求的字节数,如果read调用返回0,表示未读入任何数据,已到达了文件尾;如果返
      回-1,表示read调用出现了错误。

    #include <stdio.h>
    #include <unistd.h>
    int main(void)
    {
      char buffer[];
      int nread;
      nread = read(, buffer, );
      if (- == nread)
        write(, "A read error has occurred\n", );
      if ( (write(, buffer, nread)) != nread )
        write(, "A write error has occurred\n", );
      return ;
    }

root@ubuntu:/home/linlin/linlin/c_code# echo hello there | ./simple_read.out
        hello there
       
    open调用:
        作用:创建一个新的文件描述符。

        #include <sys/types.h>
        #include <sys/stat.h>
        #include <fcntl.h>
 
        int open(const char *pathname, int flags);
        int open(const char *pathname, int flags, mode_t mode);

open建立了一条到文件或设备的访问路径,如果调用成功,它可以返回一个可以被read,write和其它系统调用使用的文件描述符
        这个文件描述符时唯一的,它不会与任何其他运行中的进程共享。
        准备打开的文件或设备的名字作为参数path传递给函数,oflags参数用于指定打开文件所采取的动作。
        oflags参数是通过必须文件访问模式与其它可选模式相结合的方式指定的:
            模式                       说明
            O_RDONLY                   以只读方式打开
            O_WRONLY                   以只写方式打开
            O_RDWR                     以读写方式打开
       
        open调用还可以在oflags参数中包含可选模式的组合(用按位或操作):
            O_APPEND: 把写入数据追加在文件末尾
            O_TRUNC:把文件长度设置为0,丢弃已有的内容
            O_CREAT: 如果需要,就按照参数mode中给出的访问模式创建文件
            O_EXCL:与O_CREAT一起使用,确保调用者创建出文件。open调用是一个原子操作,它只执行一个函数调用。使用这个可选模
            式可以防止两个程序同时创建同一个文件。如果文件已存在,open调用将失败。
           
   
    访问权限的初始值:
        当使用代用O_CREAT标志的open调用来创建文件时,必须使用带有三个参数格式的open调用,第三个参数mode是几个标志按位或得
        到的,这些标志在sys/stat.h中定义:
            S_IRUSR: 读权限,文件属主
            S_IWUSR:写权限,文件属主
            S_IXUSR:执行权限,文件属主
            S_IRGRP: 读权限,文件属组
            S_IWGRP:写权限,文件属组
            S_IXGRP:执行权限,文件属组
            S_IROTH: 读权限,其他用户
            S_IWOTH:写权限,其他用户
            S_IXOTH:执行权限,其他用户

    #include <stdio.h>
    #include <fcntl.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    int main(void)
    {
      open("test", O_CREAT, S_IRUSR|S_IXOTH);
      return ;
    }

文件访问权限的影响因素:
        指定的文件权限只有在创建文件时才会使用
        umask(用户掩码)会影响到被创建文件的访问权限,open调用中给出的mode值将与当时的用户掩码的反值做AND操作
        例如umask为001,open调用指定了S_IXOTH模式标志,那么创建的文件对其他用户不会拥有写执行权限。
       
    open和creat调用中的标志实际上是发出设置文件访问权限的请求,所请求的权限是否会被设置取决于当时的umask值。
    
    复制文件的两个不同实现:

    #include <unistd.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    int main(void)
    {
      char block[];
      int in, out;
      int nread;
      in = open("file.in", O_RDONLY);
      out = open("file.m.out", O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR);
      while ((nread = read(in, block, sizeof(block))) > )
        write(out, block, nread);
      return ;
    }
    #include <unistd.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    int main(void)
    {
      char c;
      int in, out;
      in = open("file.in", O_RDONLY);
      out = open("file.out", O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR);
      while (read(in, &c, ) == )
        write(out, &c, );
      return ;
    }

close系统调用:
        使用close调用终止文件描述符fildes与其对应文件之间的关联。文件描述符能被释放并能够重新使用。
        close调用成功时返回0,出错时返回-1

 #include <unistd.h>
       
int close(int fildes);

检查close调用的返回结果非常重要,有的文件系统,特别是网络文件系统,可能不会再关闭文件之前报告文件写操作中
        出现的错误,这是因为在执行操作时数据可能未被正确写入。
       
   
    ioctl系统调用:
        作用;提供一个控制设备及其描述符行为和配置底层服务的接口。
        终端,文件描述符,套接字设置磁带机都可以有为它们定义的ioctl。

  #include <unistd.h>
       
int ioctl(int fildes, int cmd, ...);

ioctl对描述符fildes引用的对象执行cmd参数中给出的操作。根据特定设备支持操作的不同,它可能会有一个可选的第三参数。

Linux——系统调用笔记1的更多相关文章

  1. Linux内核笔记--内存管理之用户态进程内存分配

    内核版本:linux-2.6.11 Linux在加载一个可执行程序的时候做了种种复杂的工作,内存分配是其中非常重要的一环,作为一个linux程序员必然会想要知道这个过程到底是怎么样的,内核源码会告诉你 ...

  2. Linux 读书笔记 二

    一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou,密码shiyanlou 若不小心登出后,直接刷新页面即可 2. 环境使用 完成实验后可以点击桌面上方的“实验截图”保存并分 ...

  3. linux内核剖析(六)Linux系统调用详解(实现机制分析)

    本文介绍了系统调用的一些实现细节.首先分析了系统调用的意义,它们与库函数和应用程序接口(API)有怎样的关系.然后,我们考察了Linux内核如何实现系统调用,以及执行系统调用的连锁反应:陷入内核,传递 ...

  4. Linux 学习笔记之超详细基础linux命令 Part 14

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 13---------------- ...

  5. # linux读书笔记(3章)

    linux读书笔记(3章) 标签(空格分隔): 20135328陈都 第三章 进程管理 3.1 进程 进程就是处于执行期的程序(目标码存放在某种存储介质上).但进程并不仅仅局限于一段可执行程序代码( ...

  6. linux读书笔记(5章)

    linux读书笔记(5章) 标签(空格分隔): 20135328陈都 第五章 系统调用 5.1 与内核通信 系统调用 让应用程序受限的访问硬件设备 提供创建新进程并与已有进程通信的机制 提供申请操作系 ...

  7. Linux学习笔记(七) 查询系统

    1.查看命令 (1)man 可以使用 man 命令名称 命令查看某个命令的详细用法,其显示的内容如下: NAME:命令名称 SYNOPSIS:语法 DESCRIPTION:说明 OPTIONS:选项 ...

  8. Linux学习笔记——管道PIPE

    管道:当从一个进程连接数据流到另一个进程时,使用术语管道(pipe).# include <unistd.h> int pipe(int filedes[2]); //创建管道 pipe( ...

  9. Linux 学习笔记

    Linux学习笔记 请切换web视图查看,表格比较大,方法:视图>>web板式视图 博客园不能粘贴图片吗 http://wenku.baidu.com/view/bda1c3067fd53 ...

随机推荐

  1. P2756 网络流解决二分图最大匹配

    P2756 飞行员配对方案问题 题目背景 第二次世界大战时期.. 题目描述 P2756 飞行员配对方案问题 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语 ...

  2. (9) openssl enc(对称加密)

    对称加密工具,了解对称加密的原理后就很简单了,原理部分见下文. openssl   enc  -ciphername   [-in filename]   [-out filename]   [-pa ...

  3. python3.x Day6 IO多路复用

    IO多路复用import asyncio 这个是异步IO模块 这个还不知道怎么用 select poll epoll 都是IO多路复用 windows 仅支持select linux2.6以后 支持e ...

  4. python-基本运算符(解压缩-必考)

    基本运算符 算术运算符 x =10 y =20 print(x+y) 30 print(x-y) -10 print(x*y) 200 print(x/y) 0.5 print(x%y)#取余 10 ...

  5. Python 装饰器 property() 函数

    描述:property() 函数的作用是在新式类中返回属性值. @property 装饰器简单理解就是负责把一个方法变成属性调用 下面理解property()方法语法: class property( ...

  6. Ubuntu 配置Apache虚拟目录

    http://blog.csdn.net/spring21st/article/details/6589300 Ubuntu 配置Apache虚拟目录 http://blog.csdn.net/spr ...

  7. rac的不完全恢复

    模拟rac的不完全恢复,虽然小鱼对常规的完全和不完全恢复已经轻车熟路了,还是记录一个不完全恢复完整过程记录下来. 1 首先小鱼做了一个完全备份. RMAN> backup database in ...

  8. mysql5.7.20主从和主主搭建

    环境描述mysql主从和主主同步 注意事项:1)同步服务器网络联通,ping通,对方授权信息连接到对方数据库(防火墙开发3306)2)关闭SELinux3)同步前,双方数据库需要同步数据保持一致. 主 ...

  9. BZOJ 1221: [HNOI2001] 软件开发【最小费用最大流】

    Description 某软件公司正在规划一项n天的软件开发计划,根据开发计划第i天需要ni个软件开发人员,为了提高软件开发人员的效率,公司给软件人员提供了很多的服务,其中一项服务就是要为每个开发人员 ...

  10. Python基础教程笔记——第4章:字典

    字典 字典是Python唯一内建的数学映射类型,字典中的值没有特殊的顺序,键可以是数字,字符串,甚至是元组 字典的创建: 字典由键值对构成,字典中键是唯一的,而值不唯一.>>> a_ ...