1.open函数
1.1头文件包含
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
1.2接口原型
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
1.3参数介绍
patnname: 打开的文件名
flags: 打开文件的标志, 是通过 O_RDONLY, O_WRONLY 或 O_RDWR (指明 文件 是以 只读 ,只写 或 读写 方式 打开的) 与 下面的 零个 或 多个 可选模式 按位 或(|)操作得到的
O_CREAT 若文件不存在将创建一个新文件。
O_EXCL 通过 O_CREAT, 生成文件 , 若文件已经存在 , 则open出错 ,调用失败。若是存在符号联接 , 将会把它的联接指针的指向文件忽略。
O_TRUNC 假如文件已经存在 , 且是一个普通文件 ,打开模式又是可写(即 文件是用 O_RDWR 或 O_WRONLY 模式 打开 的) , 就把文件的长度设置为零 , 丢弃其中的现有内容.若文件是一个 FIF或终端设备文件 , O_TRUNC标志被忽略。
O_NOCTTY 假如 pathname 引用 一个 终端设备 ,即使进程没有控制终端 ,这个终端也不会变成进程的控制终端。
O_APPEND 文件以追加 模式打开 。在写以前 , 文件读写指针被置在文件的末尾 。
O_NONBLOCK 或 O_NDELAY 打开(open) 文件可以以非块(non-blocking) 模式打开 . 此时文件并没有打开 , 也不能使用返回的文件描述符进行后续操作 ,而是使调用程序等待。此模式是为了FIFO (命名管道) 的处理。
O_SYNC 打开文件实现 I/O的同步 . 任何通过文件描述符对文件的write 都会使调用的进程中断 , 直到数据被真正写入硬件中。
O_NOFOLLOW 假如 pathname 是一个符号联接 , 则打开失败。
O_DIRECTORY 假如 pathname 不是目录 , 打开就失败。不应该在执行opendir 以外使用。
1.4 返回值
open 返回一个新的文件描述符(若是有错误发生返回-1, 并在 errno设置错误信息)。
1.5 用途
打开文件(不同类型的文件)
2.read 函数
2.1 头文件包含
#include <unistd.h>
2.2接口原型
ssize_t read(int fd, void *buf, size_t count);
2.3参数介绍
fd 打开的文件描述符
buf 接收报文数据缓冲区地址
count 报文数据缓冲区大小
2.4 返回值
(1) -1 读取文件失败
(2) 0 文件读取完了
(3) > 0 读取的字节数
2.5 用途
读取文件信息,即可简单的读取文件信息,也可以用于管道通信而读取信息,也可用于socket信息的读取
3.write 函数
3.1 头文件包含
#include <unistd.h>
3.2接口原型
ssize_t write(int fd, const void *buf, size_t count);
3.3参数介绍
fd 打开的文件描述符
buf 发送报文数据缓冲区地址
count 发送报文数据缓冲区大小
2.4 返回值
(1) 成功时返回所写入的字节数(若为零则表示没有写入数据)。
(2) 错误时返回-1,并置errno为相应值。
(3) 若count为零,对于普通文件无任何影响,但对特殊文件 将产生不可预料的后果。
2.5 用途
向文件写入信息,即可简单地向文件写入信息,也可以用于管道通信而写入信息,也可用于向socket写入信息
4.lseek函数
4.1用处
(1) 获取文件大小
(2) 移动文件指针
(3) 文件拓展(移动文件指针后要再写入才能实现拓展)
4.2 头文件包含
#include <sys/types.h>
#include <unistd.h>
4.3 接口原型
off_t lseek(int fd, off_t offset, int whence);
4.3 参数介绍
fd 文件描述符
offset 文件偏移下标
whence 为下列其中一种:(SEEK_SET,SEEK_CUR和SEEK_END和依次为0,1和2).
SEEK_SET 将读写位置指向文件头后再增加offset个位移量。
SEEK_CUR 以目前的读写位置往后增加offset个位移量。
SEEK_END 将读写位置指向文件尾后再增加offset个位移量。
当whence 值为SEEK_CUR 或SEEK_END时,参数offet允许负值的出现。
4.4 返回值
当调用成功时则返回目前的读写位置,也就是距离文件开头多少个字节
。若有错误则返回-1,errno 会存放错误代码。
4.5 demo
1) 欲将读写位置移到文件开头时:
lseek(fd,0,SEEK_SET);
2) 欲将读写位置移到文件尾时:
lseek(fd,0,SEEK_END);
3) 想要取得目前文件位置时:
lseek(fd,0,SEEK_CUR)
5.stat和 lstat 函数
5.1 头文件包含
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
5.2 接口原型
//穿透(追踪)函数---穿透软连接,追踪到映射的文件上
int stat(const char *pathname, struct stat *buf);
// 不穿透(追踪),指向的是当前文件
int lstat(const char *pathname, struct stat *buf);
5.3 参数介绍
pathname 文件名
buf 传出结构体,包含文件的信息
5.4 struct stat 定义
struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* inode number */
mode_t st_mode; /* protection */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device ID (if special file) */
off_t st_size; /* total size, in bytes */
blksize_t st_blksize; /* blocksize for filesystem I/O */
blkcnt_t st_blocks; /* number of 512B blocks allocated */
};
5.5返回值
成功返回0,失败返回-1,设置perrno
5.6用途
用于获取文件的各种信息
stat demo
模拟ls -l查看文件信息的效果
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>
#include <pwd.h>
#include <grp.h>
#include <string>
using namespace std;
int main(int arg_num, char *args[]){
if(arg_num < 2){
cout << "./a.out filename" << endl;
exit(1);
}
struct stat buf;
int ret = stat(args[1], &buf);
if(ret == -1){
perror("stat");
exit(1);
}
char perms[11] = {0};
// get the type of file
switch(buf.st_mode & S_IFMT){
case S_IFLNK: perms[0] = 'l'; break;
case S_IFDIR: perms[0] = 'd'; break;
case S_IFREG: perms[0] = '-'; break;
case S_IFBLK: perms[0] = 'b'; break;
case S_IFCHR: perms[0] = 'c'; break;
case S_IFSOCK:perms[0] = 's'; break;
case S_IFIFO: perms[0] = 'P'; break;
default:perms[0] = '?';break;
}
//judge the power of using file
// power of file owner
perms[1] = buf.st_mode & S_IRUSR ? 'r' : '-';
perms[2] = buf.st_mode & S_IWUSR ? 'w' : '-';
perms[3] = buf.st_mode & S_IXUSR ? 'x' : '-';
// power of file group
perms[4] = buf.st_mode & S_IRGRP ? 'r' : '-';
perms[5] = buf.st_mode & S_IWGRP ? 'w' : '-';
perms[6] = buf.st_mode & S_IXGRP ? 'x' : '-';
// power of others
perms[7] = buf.st_mode & S_IROTH ? 'r' : '-';
perms[8] = buf.st_mode & S_IWOTH ? 'w' : '-';
perms[9] = buf.st_mode & S_IXOTH ? 'x' : '-';
// hard links
int link_num = buf.st_nlink;
// file owner
string file_user = getpwuid(buf.st_uid)->pw_name;
// file group
string file_group = getgrgid(buf.st_gid)->gr_name;
// file size
int file_size = (int) buf.st_size;
// change time
string change_time = ctime(&buf.st_mtime);
change_time[change_time.length()-1] = '\0';
cout << perms << " " << link_num << " " << file_user;
cout << " " << file_group;
cout << " " << file_size << " " << change_time;
cout << " " << args[1] << endl;
return 0;
}
运行效果
Comments