鱼C论坛

 找回密码
 立即注册
查看: 2288|回复: 5

[技术交流] Linux系统编程之文件IO 二

[复制链接]
发表于 2014-11-20 19:54:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Crazy迷恋. 于 2014-11-20 23:13 编辑

   进程控制块PCB
  task_struct 结构体,这个结构体位于/usr/src/linux-headers/include/linux/sched.h (注:linux-headers写的只是头几种后边还有些什么版本之类的,可自行选择查看),这个结构定义相当复杂,每一个进程都会有一个自己灯pcb 它位于内核当中,每一个进程自行维护自己的pcb,这里只做简单的介绍,如果真要整明白这个pcb 就得将内核的这块东西翻个遍了。pcb中有一个相当重要的定义也是本主题的重要内容。那就是文件描述符表,files_struct结构体。
这个结构体在  task_struct 结构体中有定义。
这里我也给出我们老师灯一张图:
程序地址空间.png
文件描述符
   文件描述符才是我们这个主题重点关系和关注的问题。pcb有一个结构指向了一个文件描述符表。
   那么现在我们来看两个函数open 函数以及 close 函数
   man page 里定义如下:
       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);

       close函数:
       #include <unistd.h>
       int close(int fd);

       一个进程中默认打开三个文件描述符
#define STDIN_FILENO    0
#define STDOUT_FILENO 1
#define STDERR_FILENO 2

   那好既然这样,那我们就来看看这些函数灯使用方法
   open的返回值  我们还是以man page 为准来look 一下
RETURN VALUE
       open() and creat() return the new file descriptor, or -1 if an error occurred (in which case, errno is set appropriately).
这里大概的意思是说 如果open 执行成功会返回 一个新的文件描述符,(creat到现在貌似是废弃了恩。。。不貌似老师提过,有兴趣灯可以去查查。)
如果执行失败了会返回-1 并会修改全局变量 errno 的值 。(如果不理解的话可以先放一放)
第一个参数 就是文件了,和fopen 第一个参数一样灯。第二个参数类似于 fopen 的第二个参数也类似fopen,但形式上略有不同,这里为它定义了很多个宏我们使用这些宏就行,这里注意的是当用O_CREAT 的时候会不一样 ,如果有 有创建的话,它会要你给出一个掩码,这个掩码于系统的掩码相与 ,系统掩码可输入 umask 查看。
snapshot1.png
close 函数就简单的多了就是就是关闭一个文件描述符。传入文件描述符就可以关闭它了。

   好了这些只是些函数的介绍,没什么深度。在这里就让我们回到 上一个帖子吧。printf 了为什么没有输出?
按照道理程序结束后是会去刷新缓冲区的。看到这了的话其实也没什么不理解的,printf  是 write 上层的函数,printf 会将暂时存放在缓冲区中,缓冲区是在FILE 当中 在write 之上,那么当buf没有满又没有刷新的情况下close 掉了默认打开的标准输出文件描述符,close 根本就不知道上边还有个缓冲区,直接就关了。所有造成没有打出来。
close.png
很多时候很多人称write 为无缓冲区编程,其实write 也是有缓冲区的。不过那块缓冲区在内核。所以它并不是绝对安全。也存在突然断电情况下丢失数据的可能。不过貌似可以通过一些手段修改。
     
  read 函数
   #include <unistd.h>

   ssize_t read(int fd, void *buf, size_t count);
   第一个是文件描述符第二个是读入的缓冲区 第三个是缓冲区大小,返回值是读入的数据字符数。

   要特别注意的是文件描述符是有权限限制的。那就是open 的时候的第二个参数。如果是只读权限你对描述符写的话是不行的。

  这些函数若失败会返回的都是-1 而且都会去设置errno  这个全局变量。我们可以使用perror()这个函数将错误信息输出出来。
  #include <stdio.h>

       void perror(const char *s);

       #include <errno.h>

       const char *sys_errlist[];
       int sys_nerr;
       int errno;
说了这么多那就来一段吧:
游客,如果您要查看本帖隐藏内容请回复


顺便说下,刚用这输入法,各种不顺手。错别字一堆。所以大家明白意思就行了。

  

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-11-20 22:00:28 | 显示全部楼层
强烈支持恋恋~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-11-24 12:08:54 | 显示全部楼层
支持支持
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-11-24 12:09:24 | 显示全部楼层
楼主是看的书?还是视频
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-11-24 12:59:20 | 显示全部楼层
支持
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-12-1 13:01:35 | 显示全部楼层

支持支持
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 21:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表