12月29号
缓冲:
全缓冲-----
标准I/0 是高级磁盘I/0(基于文件I/0的一个封装)
写数据:
按字符读写: getc putc
Getchar putchar
按行读写: fgets fputs
遇\0 返回 注意缓冲区定义为 char buff[N];
按指定大小: fread (返回值为读到的多少个元素) fwrite (buf ,对象块(指定元素的大小),指定元素的个数,stream)
文件I/0
- 低级磁盘I/0,会引起系统调用,无缓冲,文件描述符来访问{0,1,2}
- 文件描述符 是一个非负整数
系统调用函数:
1.打开 int open(path ,flags) 功能:打开一个文件。。。。。。创建只能创建普通文件。。。。
flags权限{ (宏的组合)
O_RDONLY 只读方式,文件必须存在;
O_WRONLY 只写方式,文件必须存在; r+
O_CREAT 创建, !!!!!必须指定文件的权限{怎么确定文件访问权限? Mode & (~umask)文件掩码 /etc/profile 文件权限掩码:umank 022};
O_RDWR 读写方式
O_TRUNC 截止, 如打开一文件,如果存在,先删除文件中原有数据。。。
O_APPEND 追加文件末尾
}}
r =è open(path, O_RDONLY)
r+ =è open(path , O_RDWR)
W ==è open(path, O_WRONLY | O_CREAT | O_TRUNC,0666)
W+ =è open(path, O_RDWR | O_CREAT | O_TRUNC ,0666 )
a =è open(path, O_WRONLY | O_CREAT | O_APPEND, 0666 ) 只写追加,不存在则创建
a+ =è open(path, O_RDWR | O_CREAT | O_APPEND ,0666)
open 成功则返回一个新的文件描述符,失败返回 -1;
- close 关闭文件描述符
读写:
1.read (fds, buf ,size_t) char buff[N];
Read 成功 返回读取的字节n <=size n==0时 读取到文件末尾。。。。
2.写:write (fdest,buf, n ) n为read成功读取的数据的字节
定位函数:lseek只对常规文件有效,不会引起任何I/O操作,即磁盘操作。。。。不能操作socket、FIFO和管道等文件
lseek (fd, offset, whence) fd =èfp->_fileno 获取fd文件描述符!!!!!!!
offset 偏移量 正向前,,,,负,向后
whence{ 宏。。。。
SEEK_SET
SEEK_CUR
SEEK_END
}
文件位偏移量可以大于文件的当前长度,在这种情况下,对对该文件的操作会延长文件,形成空洞。。。。。
空洞?
作用:可以造成多点下载·····
- 函数
① access(path ,R_OK) 测试函数的执行权限 F_OK 测试文件是否存在。。。。。。
成功返回0,失败返回-1.。。。。。。。。。。
② umask(mode_t mode) 只对当前文件有效。。。
③ chmod (path , mode_t mode) 修改文件的权限
fchmod(fd, mode_t mode)
④ chown (path , uid_t owner, gid_t group)更改文件的用户ID和组ID
⑤ truncate(path, off_t length) 文件末端处截取一些数据以缩短文件
ftruncate(fd, off_t length)
删除文件:
unlink
remove
int rename(const char *old, const char * new)
链接:
① 软链接ln –s (创建一个快捷方式,新建一个_inode_nero,指向一块相应的块的位子,这个块存放的是原_inode的路径、地址)
② 硬链接 ln filename newfilenema
目录项中添加一个新的目录,使它们都指向同一个地方的节点。。。。。
ls - i 查看文件的_inode 的编号。。。。。
目录文件中存放的是。
每种文件系统对应都有一个超级块--------系统启动时,双向循环链表
每个文件 都有一个 _inode节点(包含文件信息)-----修改时间,大小,用户ID/组ID。
_inode 中存在一个指向文件所在位子(块)的指针。。。。。。
③ 重点掌握 _inode节点。。。。。
stat()
fstat
lstat(path, struct stat *buf) 将path的信息写入内存缓冲区中。。。。。。怎么传参呢?先定义一个struct stat buf; 然后 将&buf 传参。。。可以使用点操作符buf.st_ino 访问inode
vim -t st_mode。。。。。。 crtl +右括号 进入需要查找的宏
*****重点 (如何取得文件类型----检测宏)
st_mode (unsigned int类型 32位) 怎么判断倒数第3位是1或者0????
文件类型----进程-----user------group------other 一共16位
4位 3位 3位 3位 3位
1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 和 0170000(S_IFREG)相与
取得件类型打印―――检测宏
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>
#include <grp.h>
#include <pwd.h>
int main(int argc, char *argv[])
{
struct stat buf;
struct tm *tp;
int n;
lstat(argv[1], &buf);
switch(buf.st_mode & S_IFMT)
{
case S_IFBLK: printf("b"); break;
case S_IFCHR: printf("c"); break;
case S_IFDIR: printf("d"); break;
case S_IFREG: printf("-"); break;
case S_IFLNK: printf("l"); break;
case S_IFSOCK: printf("s"); break;
case S_IFIFO: printf("p"); break;
}
for(n=8; n>=0; n--)
{
if(buf.st_mode & (1 << n))
{
switch(n%3)
{
case 2: printf("r"); break;
case 1: printf("w"); break;
case 0: printf("x"); break;
}
}
else
printf("-");
}
printf(" %02d ", buf.st_nlink);
printf("%s ", getpwuid(buf.st_uid)->pw_name);
printf("%s ", getgrgid(buf.st_gid)->gr_name);
printf("%8ld ", buf.st_size);
tp = localtime(&buf.st_mtime);
printf("%d-%2d-%2d %02d:%02d:%02d", tp->tm_year+1900, tp->tm_mon+1, tp->tm_mday,\
tp->tm_hour, tp->tm_min, tp->tm_sec);
printf(" %s\n", argv[1]);
return 0;
}