嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

周梦康 发表于 2015-10-31 2644 次浏览 标签 : Linux计算机基础

早上一觉睡到大中午,看了会书,做点关键字笔记,仅供自己复习了,旁人可无视。

文件类型

  1. 普通文件/etc/passwd

  2. 目录文件/etc

  3. 块特殊文件/dev/sr0

  4. 字符特殊文件/dev/tty

  5. FIFO(管道)/var/lib/oprofile/opd_pipe

  6. 套接字/dev/log

  7. 符号链接/dev/cdrom

所有的I/O函数都是围绕文件描述符,而对于标准I/O库,它们的操作都是围绕stream进行的。当使用标准I/O库打开或创建一个文件时,我们已使一个流和一个文件相关联。

对于ASCII字符集,一个字符可以用一个字节表示,但是对于国际字符集,一个字符需要多个字节表示。

流的定向决定了读写是单字节还是多字节。

fwide 设置流的定向

freopen 清除流的定向


对于一个进程预定义了三个流,标准输入,标准输出,标准错误,并且这三个流可以自动地被进程使用。这三个流引用的文件描述符分别是STDIN_FILENO STDOUT_FILENO STDERR_FILENO,也就是0,1,2


标准I/O库的缓冲

  1. 全缓冲

  2. 行缓冲

  3. 不带缓冲

一般来说,标准错误是不带缓冲的,打开至终端设备的流是行缓冲,其他流是全缓冲。


非格式化I/O的类型

  1. 每次一个字符的I/O getc fgetc getchar

  2. 每次一行的I/O fgets fputs

  3. 直接I/O(二进制I/O)fread fwrite

  4. 格式化I/O printf scanf

gets 是一次读取一行,但是不能指定缓冲区长度,可能会造成缓冲区溢出(如果该行长于缓冲区长度)

sprintf 也有类似的问题,造成缓冲区溢出


在php手册上经常看到二进制I/O这个关键字,一直不明白,今天终于明白了,比如说PHP手册上对fwrite的介绍 http://php.net/manual/en/function.fwrite.php 并不能看出这个I/O函数的特殊之处,还是在往文件里写字符串。但是在标准I/O库中是用于从二进制文件中读写一个或多个结构或对象。

// 1.读写一个二进制数组,为了将一个浮点数组的2~5个元素写至一个文件上
// fwrite(const void * ptr, size_t size, size_t nobj, FILE * fp);
float data[10];

if(fwrite(&data[2], sizeof(float), 4, fp) != 4){
	err_sys("fwrite error");
}

// 2.读写一个结构
struct {
	short count;
	long  total;
	char  name[NAMESIZE];
} item;

if(fwrite(&item,sizeof(item),1,fp) != 1){
	err_sys("fwrite error");
}

不过心里还是有困惑,关于PHP里的

http://php.net/manual/zh/ref.filesystem.php

http://php.net/manual/zh/book.stream.php

如果在文件系统函数里面的很多函数是封装的标砖I/O库的函数,那么下面的流扩展,是不是就是System V里的STREAMS I/O? 因为在书上有提到不要把标准I/O库里有stream(流)和System V里的STREAMS I/O系统混淆。

嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

评论列表