zoukankan      html  css  js  c++  java
  • Linux学习笔记-基本操作5

    1. Linux文件操作相关函数

            stat函数 :获取文件属性(从inode上获取)
                    返回值:
                        成功:0
                        失败:-1
                    文件属性:
                        struct stat {
                        dev_t         st_dev;       //文件的设备编号
                        ino_t         st_ino;       //节点
                        mode_t        st_mode;      //文件的类型和存取的权限
                        nlink_t       st_nlink;     //连到该文件的硬连接数目,刚建立的文件值为1
                        uid_t         st_uid;       //用户ID
                        gid_t         st_gid;       //组ID
                        dev_t         st_rdev;      //(设备类型)若此文件为设备文件,则为其设备编号
                        off_t         st_size;      //文件字节数(文件大小)
                        blksize_t     st_blksize;   //块大小(文件系统的I/O 缓冲区大小)
                        blkcnt_t      st_blocks;    //块数
                        time_t        st_atime;     //最后一次访问时间
                        time_t        st_mtime;     //最后一次修改时间
                        time_t        st_ctime;     //最后一次改变时间(指属性)
                        };
                    特性:能够穿透(跟踪)符号链接  (穿透的命令举例:vi)


            lstat函数
                    特性:不穿透(跟踪)符号链接 (不穿透的命令举例:ls -l 、rm)
                区别:对软链接,stat返回软链接对应文件的大小。
                    lstat返回软链接的大小。
            access函数:测试指定文件是否拥有某种权限
                    原型:int access(const char *pathname, int mode);
                        pathname --> 文件名
                        mode --> 权限类别
                            R_OK 是否有读权限
                            W_OK 是否有写权限
                            X_OK 是否有执行权限
                            F_OK 测试一个文件是否存在
                    返回值:
                        0 --> 所有欲查核的权限都通过了检查
                        -1 --> 有权限被禁止
            chmod函数:改变文件的权限
                    原型:int chmod( const char *filename, int pmode );
                        filename --> 文件名
                        pmode --> 权限 必须是一个8进制数
                    返回值:
                        0 --> 改变成功
                        -1 --> 失败
            chown函数:改变文件的所有者
                    原型:int chown(const char *path, uid_t owner, gid_t group);
                        uid_t owner-->用户名
                        gid_t group-->组名
                        (vi /etc/passwd有对应的数字,每一列的含义可以man 5 passwd查看)
                    返回值:
                        0 --> 成功
                        -1 --> 失败            
            truncate函数:将参数path 指定的文件大小改为参数length             指定的大小。如果原来的文件大小比参数length大,则超过的部分会被删去。
                    原型:int truncate(const char *path, off_t length);
                        path --> 文件路径
                        length --> 指定的文件大小
                    返回值:
                        0 --> 执行成功
                        -1 --> 执行失败
                    原文件长度 100
                    第二个参数指定长度为 20 -->    文件截断
                    原文件长度 100
                    第二个参数指定长度为 300 -> 文件被拓展
            链接函数:
                link函数:创建一个硬链接
                    原型:int link(const char *oldpath, const char *newpath);
                symlink函数:创建一个软连接
                readlink函数:读软连接对应的文件名,不是读内容
                unlink函数:如果想通过调用这个函数来成功删除文件,你就必须拥有这个文件的所属目录的写和执行权限。
                    使用:
                        1. 如果是符号链接,删除符号链接
                        2. 如果是硬链接,硬链接数减1,当减为0时,释放数据块和inode
                        3. 如果文件硬链接数为0,但有进程已打开该文件,并持有文件描述符,则等该进程关闭该文件时,kernel才真正去删除该文件。利用该特性创建临时文件,先open或creat创建一个文件,马上unlink此文件,直到关闭该文件时,该文件才会被删除。
            rename函数:文件重命名
                函数原型:int rename(const char *oldpath, const char *newpath);

    2. Linux目录操作相关函数

            chdir 函数:修改当前进程的路径
                原型:函数原型:int chdir(const char *path);
            getcwd 函数:获取当前进程工作目录
                函数原型:char *getcwd(char *buf, size_t size);
            mkdir 函数:创建目录
                注意:创建的目录需要有执行权限,否则无法进入目录
                函数原型:int mkdir(const char *pathname, mode_t mode(0777 8进制));
            rmdir 函数:删除一个空目录
                函数原型:int rmdir(const char *pathname);
            opendir 函数:打开一个目录 man 3 opendir (第三章)
                函数原型:DIR *opendir(const char *name);
                返回值:
                    DIR结构指针,该结构是一个内部结构,保存所打开的目录信息,作用类似于FILE结构
                    函数出错返回 NULL
            readdir 函数:读目录
                函数原型:struct dirent *readdir(DIR *dirp);
                返回值:
                    成功返回一条记录项:
                        struct dirent
                        {
                            ino_t d_ino;               // 此目录进入点的inode
                            ff_t d_off;                // 目录文件开头至此目录进入点的位移
                            signed short int d_reclen; // d_name 的长度, 不包含NULL 字符
                            unsigned char d_type;      // d_name 所指的文件类型
                            har d_name[256];           // 文件名
                        };
                    失败返回NULL
            closedir 函数:关闭目录

    3. fcntl 函数:改变已经打开的文件的属性,根据文件描述符来操作文件的状态 -- #include <fcntl.h>

            函数原型:    int fcntl(int fd, int cmd);
                        int fcntl(int fd, int cmd, long arg);
                        int fcntl(int fd, int cmd, struct flock *lock);
            


            例如:打开文件的时候: 只读
            修改文件的属性: 添加追加 O_APPEND
                flag = fcntl(fd,F_GETFL,0);
                flag |= O_APPEND;
                fcntl(fd,F_SETFL,flag);
                        

    4. dup, dup2函数 

           dup 函数:复制现有的文件描述符
                原型:int dup(int oldfd);
                返回值:的是文件描述符表中没有被占用的最小文件描述符
            dup2 函数:把oldfd复制文件描述符newfd,
                    1->如果new是一个被打开的文件描述符,在拷贝前先关掉new
                    2->如果old和new 是同一个,不会关掉new,直接返回的还是旧的文件描述符
                原型:int dup(int oldfd,int newfd);
                返回值:的是文件描述符表中没有被占用的最小文件描述符


    解决gcc编译过程中c99语法报错的问题
    ~/.bashrc
    alias gcc='gcc -std=gnu99'

    索引节点inode:保存的其实是实际的数据的一些信息,这些信息称为“元数据”(也就是对文件属性的描述)。
    例如:文件大小,设备标识符,用户标识符,用户组标识符,文件模式,扩展属性,文件读取或修改的时间戳,
    链接数量,指向存储该内容的磁盘区块的指针,文件分类等等。
    ( 注意数据分成:元数据+数据本身 )

    注意inode怎样生成的:每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定
    (现代OS可以动态变化),一般每2KB就设置一个inode。一般文件系统中很少有文件小于2KB的,所以预定按照2KB分,
    一般inode是用不完的。所以inode在文件系统安装的时候会有一个默认数量,后期会根据实际的需要发生变化。

    注意inode号:inode号是唯一的,表示不同的文件。其实在Linux内部的时候,访问文件都是通过inode号来进行的,
    所谓文件名仅仅是给用户容易使用的。当我们打开一个文件的时候,首先,系统找到这个文件名对应的inode号;然后,
    通过inode号,得到inode信息,最后,由inode找到文件数据所在的block,现在可以处理文件数据了。

    inode和文件的关系:当创建一个文件的时候,就给文件分配了一个inode。一个inode只对应一个实际文件,
    一个文件也会只有一个inode。inodes最大数量就是文件的最大数量。

  • 相关阅读:
    uva624 CD (01背包+路径的输出)
    算法:全排列
    Android使用Intent实现拨打电话的动作
    Java并发编程从入门到精通 张振华.Jack --我的书
    《算法导论》— Chapter 12 二叉查找树
    Java中arraylist和linkedlist源代码分析与性能比較
    Cg入门14:Vertex Shader
    Nucleus PLUS的启动、执行线程和中断处理
    Unity Shaders and Effects Cookbook (3-5) 金属软高光
    EasyDarwin开发出相似于美拍、秒拍的短视频拍摄SDK:EasyVideoRecorder
  • 原文地址:https://www.cnblogs.com/DA799422035/p/9062770.html
Copyright © 2011-2022 走看看