10月22日笔记系统IO_2目录

1.umask 掩码        umask
NAME
        umask - set file mode creation mask
        umask设置一个文件创建时的掩码
        umask设置权限位中为1的bit 创建文件时候不能指定        111 111 101
        000 000 010=>002

SYNOPSIS
       #include <sys/types.h>
       #include <sys/stat.h>

       mode_t umask(mode_t mask);

      mode_t mask : 新的掩码
       返回值是 上一次的掩码;

        设置为零就可以有所有的权限来进行修改


2.获取进程的当前工作目录        getcwd        getwd
    getwd:get working directory 
    NAME
        getcwd, getwd, get_current_dir_name - get current working directory

    SYNOPSIS
        #include <unistd.h>

        char *getwd(char *buf);

          char *buf : 用来保存获取进程的工作目录的绝对路径 

            返回值  成功返回当前工作目录字符串的首地址
                失败返回NULL 同时errno被设置
        
        getwd 有一个巨大bug,一旦出现,程序崩溃  段错误
        如果buf指向的空间不够大,getwd就有可能去访问buf后面的内存
        造成内存的非法访问

        为了解决这个bug 后来推出了getcwd      

char *getcwd(char *buf, size_t size);

        它和getwd的唯一区别是多了一个size 这个参数表明buf的大小
    


3.改变进程的当前工作目录        chdir         fchdir
        chdir
        fchdir
    NAME
        chdir, fchdir - change working directory

    SYNOPSIS
        #include <unistd.h>

        int chdir(const char *path);
        int fchdir(int fd);


4.文件截短         truncate         ftruncate
    NAME
        truncate, ftruncate - truncate a file to a specified length

        SYNOPSIS
            #include <unistd.h>
            #include <sys/types.h>

            int truncate(const char *path, off_t length);
            int ftruncate(int fd, off_t length);

            将文件改变到指定的长度
            两者的区别是一个输入文件路径的字符串

                                  一个是文件描述符

            off_t length < 源文件的长度
                截短  比length长那部分文件被舍弃掉
            
           off_t length > 源文件长度
            扩展文件 留空洞 空洞中的数据是未知的
            返回值 
                成功返回0
                失败返回-1 同时errno被设置


5.删除文件         unlink   rmdir    remove
    unlink     删除文件
    rmdir      删除一个空目录
    remove  删除一个文件或空目录

    NAME
       unlink, unlinkat - delete a name and possibly the file it refers to
    SYNOPSIS
        #include <unistd.h>        文件

        int unlink(const char *pathname);

      const char *pathname:你要删除的文件
            返回值 成功返回0
                失败返回-1 同时errno被设置

    NAME
            rmdir - delete a directory

    SYNOPSIS
        #include <unistd.h>        空目录

        int rmdir(const char *pathname);

                    返回值 成功返回0
                                失败返回-1 同时errno被设置

    NAME
        remove - remove a file or directory

    SYNOPSIS
        #include <stdio.h>        文件或空目录

        int remove(const char *pathname);

                    返回值 成功返回0
                                失败返回-1 同时errno被设置

    NOTE:unlink 把删除文件的Inode删除(仅仅是做了一个标记
               inode是free状态)


6.获取文件属性        stat        f stat        l stat        f stat at

    NAME
        stat, fstat, lstat, fstatat - get file status

    SYNOPSIS
        #include <sys/types.h>
        #include <sys/stat.h>
        #include <unistd.h>

        int stat(const char *pathname, struct stat *statbuf);
        int fstat(int fd, struct stat *statbuf);
        int lstat(const char *pathname, struct stat *statbuf);

    const char *pathname:要获取属性的那个文件名
      int fd:要获取属性的那个文件的文件描述符
     struct stat *statbuf:指向一个结构体,用来保存文件的属性信息
                
        返回值成功返回0 失败返回-1 同时errno被设置

        stat  是用来获取path指定的那个文件的属性信息的,获取到的信息
                用buf指向的结构体来保存 
        stat与fstat
            stat不需要打开文件,给文件就可以了
            fstat需要打开文件 因为它的第一个参数是文件描述符 
            除此,两种没有区别
        
        lstat 对于非符号链接文件和stat没有区别
                对于符号链接文件 lstat获取的是符号链接文件本身的属性
                                              stat获取的是符号链接文件指向的那个文件的属性

结构体:

struct stat {
               dev_t     st_dev;         /* ID of device containing file */
                                                保存这个文件的设备的ID
               ino_t     st_ino;         /* Inode number */
                                                文件Inode的编号
               mode_t    st_mode;        /* File type and mode */
                                                      文件类型和权限
                                        st_mode用位域方式来表示文件的类型和权限
                                        
                                        位域 用一个bit去表示真/假、有/无
                                                rwx     100
                                            对一个bit的赋值不会干扰到其他位


                          如何解析?st_mode
                             struct stat st;
                           S_ISREG(st.st_mode)    为真则表示该文件为普通文件        -
                           S_ISDIR(st.st_mode)      为真则表示该文件为目录               d
                           S_ISCHR(st.st_mode)    为真则表示该文件为字符设备        c   打印机
                           S_ISBLK(st.st_mode)    为真则表示该文件为设备            b   各种硬盘
                           S_ISFIFO(st.st_mode)   为真则表示该文件为管道文件         p   进程间通信
                           S_ISLNK(st.st_mode)    为真则表示该文件为符号链接文件  l   快捷方式
                           S_ISSOCK(st.st_mode) 为真则表示该文件为套接字文件     s
                                   st_mode还包含文件的权限位
                                        if(st.st_mode & S_IRUSR)
                                        {
                                            user有读权限
                                        }
                                        。。。。


               nlink_t   st_nlink;       /* Number of hard links */
                                                硬链接数
               uid_t     st_uid;         /* User ID of owner */
                                                文件所有者的ID
               gid_t     st_gid;         /* Group ID of owner */
                                                文件所有者所在的组ID
               dev_t     st_rdev;        /* Device ID (if special file) */
                                                设备号 如果这个是设备就会有
               off_t     st_size;        /* Total size, in bytes */
                                              文件内容大小
               blksize_t st_blksize;     /* Block size for filesystem I/O */
                                                    块的大小 这个跟硬件设备有关 一般512字节一块
               blkcnt_t  st_blocks;      /* Number of 512B blocks allocated */
                                                    你的文件占多少块
               /* Since Linux 2.6, the kernel supports nanosecond
                  precision for the following timestamp fields.
                  For the details before Linux 2.6, see NOTES. */

               struct timespec st_atim;  /* Time of last access */
                                                       最后访问文件内容的时间
               struct timespec st_mtim;  /* Time of last modification */
                                                        最后修改文件内容的时间
               struct timespec st_ctim;  /* Time of last status change */
                                                      最后修改文件属性的时间

           #define st_atime st_atim.tv_sec      /* Backward compatibility */
           #define st_mtime st_mtim.tv_sec
           #define st_ctime st_ctim.tv_sec
           };
    


    1.写一个函数,删除文件或目录(可能是非空目录)
    2.写一个函数 打印文件的类型 读写权限 硬链接数 文件大小

        
 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值