Linux系统编程之文件IO 二
本帖最后由 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 结构体中有定义。
这里我也给出我们老师灯一张图:
文件描述符
文件描述符才是我们这个主题重点关系和关注的问题。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 查看。
close 函数就简单的多了就是就是关闭一个文件描述符。传入文件描述符就可以关闭它了。
好了这些只是些函数的介绍,没什么深度。在这里就让我们回到 上一个帖子吧。printf 了为什么没有输出?
按照道理程序结束后是会去刷新缓冲区的。看到这了的话其实也没什么不理解的,printf是 write 上层的函数,printf 会将暂时存放在缓冲区中,缓冲区是在FILE 当中 在write 之上,那么当buf没有满又没有刷新的情况下close 掉了默认打开的标准输出文件描述符,close 根本就不知道上边还有个缓冲区,直接就关了。所有造成没有打出来。
很多时候很多人称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;
说了这么多那就来一段吧:
**** Hidden Message *****
顺便说下,刚用这输入法,各种不顺手。错别字一堆。所以大家明白意思就行了。
{:7_139:}强烈支持恋恋~ 支持支持 楼主是看的书?还是视频 支持{:5_106:}
支持支持
页:
[1]