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_CURSEEK_END和依次为012.

SEEK_SET 将读写位置指向文件头后再增加offset个位移量。

SEEK_CUR 以目前的读写位置往后增加offset个位移量。

SEEK_END 将读写位置指向文件尾后再增加offset个位移量。

whence 值为SEEK_CUR SEEK_END时,参数offet允许负值的出现。

 

4.4 返回值

当调用成功时则返回目前的读写位置,也就是距离文件开头多少个字节

。若有错误则返回-1errno 会存放错误代码。

4.5 demo

1) 欲将读写位置移到文件开头时:

lseekfd,0,SEEK_SET);

2) 欲将读写位置移到文件尾时:

lseekfd0,SEEK_END);

3) 想要取得目前文件位置时:

lseekfd0,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;

}

运行效果

346bdb1f8161657101f4fbc89d9a57a.png