尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

自学嵌入式第N天(Linux篇——文件编程)

自学嵌入式第N天(Linux篇——文件编程) 今天是文件夹的操作主播感觉自己学懵了希望写完这一篇能给自己理明白。一、基础操作1.打开opendir头文件#include sys/types.h#include dirent.h形式DIR *opendir(const char *name);参数name要打开的文件夹返回值成功时返回文件夹的流指针指向第一个文件失败时返回NULLerrno会被设置2.关闭closedir头文件#include sys/types.h#include dirent.h形式int closedir(DIR *dirp);参数要关闭的目录这里要写opendir的返回值返回值成功时返回0失败时返回-1errno会被设置注意不要多次释放。3.读readdir文件夹只能读不能写头文件#include sys/types.h#include dirent.h形式struct dirent *readdir(DIR *dirp);参数要读的目录这里要写opendir的返回值返回值成功时返回一个结构体指针失败时返回NULLerrno会被设置。这里要注意返回的截个结构体的内容d_ino是文件真正的本体编号系统内核靠 inode 管理文件所有底层信息一个 inode 里面保存着 文件权限、大小、硬盘数据存储位置、硬链接计数、创建 / 修改时间、属主 uid/gid 等全部属性stat结构体里的st_ino和这里的d_ino是同一个数字。d_type表示文件的类型d_type 宏含义st_mode 提取的类型宏DT_REG普通文件S_IFREGDT_DIR文件夹S_IFDIRDT_LNK软链接S_IFLNKDT_CHR字符设备S_IFCHRDT_BLK块设备S_IFBLKDT_FIFO有名管道S_IFIFODT_SOCK套接字S_IFSOCKd_name是正在读的文件的名字。二、进阶操作1.chdir头文件#include unistd.h形式int chdir(const char *path);功能改变当前程序的工作路径参数path改变到的路径返回值成功时返回0失败时返回-1例子这里可以看到工作路径改变了我们就可以在一个代码中在不同位置创建文件夹或者文件。2.getcwd头文件#include unistd.h形式char *getcwd(char *buf, size_t size);功能获得当前路径参数buf用来保存工作路径的首地址size用来保存保存路径空间的长度返回值成功时返回包含路径空间的字符串首地址就是buf失败时返回NULL.3.mkdir头文件 #include sys/stat.h#include sys/types.h形式 int mkdir(const char *pathname, mode_t mode);功能创建一个目录参数pathname目录名mode目录的模式这个在将stat函数的时候详细讲返回值成功时返回0失败时返回-14.stat头文件 #include sys/types.h #include sys/stat.h#include unistd.h形式int stat(const char *pathname, struct stat *statbuf)功能创建一个目录参数pathname目录名mode目录的模式这个在将stat函数的时候详细讲返回值成功时返回0失败时返回-1字段解释st_dev文件所在的设备分区IDst_inoinode 号文件在分区里的身份证st_mode类型 权限16 位位运算st_nlink硬链接数st_uid所有者用户 IDst_gid所属组 IDst_rdev设备文件的设备号普通文件忽略st_size文件逻辑大小字节st_blksize文件系统 I/O 块大小一般 4096st_blocks实际占用的 512B 块数st_atime最后访问时间st_mtime最后修改时间ls -l显示的st_ctime最后状态改变时间可以通过形参的结构体变量来访问这个文件的参数。·st_mode这里面最复杂的就是st_mode它是由16位二进制组成0-3位代表文件类型4-6位代表特殊权限区7-9位是所有者权限10-12位是所属组权限13-15是其他人权限。那我们怎么能分别拿到他的文件类型以及各种权限呢我们将st_modeS_IFMT就可以让文件类型位保持不变其余位均位0然后再通过switchcase进行比较就可以拿到对应的类型是什么。常量名八进制值16 位二进制高 4 位含义打印字符S_IFMT01700001111 0000 0000 00001111类型掩码抠类型用的筛子—S_IFSOCK01400001100 0000 0000 00001100套接字 socketsS_IFLNK01200001010 0000 0000 00001010符号链接lS_IFREG01000001000 0000 0000 00001000普通文件-S_IFBLK00600000110 0000 0000 00000110块设备bS_IFDIR00400000100 0000 0000 00000100目录dS_IFCHR00200000010 0000 0000 00000010字符设备cS_IFIFO00100000001 0000 0000 00000001管道 FIFOp这个特殊权限不常用就不说了。常量名八进制值16 位二进制所在位含义S_ISUID00040000000 1000 0000 0000bit11执行时临时变成文件所有者S_ISGID00020000000 0100 0000 0000bit10执行时临时变成文件所属组S_ISVTX00010000000 0010 0000 0000bit9sticky 粘滞位如 /tmp 目录所有者权限有三位从左到右为读写执行三个权限和模式一样我们将st_modeS_IRUSR如果为1说明所有者有读的权限依次类推便可拿到所有者所属组其他用户都有什么权限。常量名八进制值16 位二进制所在位含义S_IRWXU007000000 0001 1100 0000bit8~6所有者权限掩码rwx 三位全 1S_IRUSR004000000 0001 0000 0000bit8所有者有读权限S_IWUSR002000000 0000 1000 0000bit7所有者有写权限S_IXUSR001000000 0000 0100 0000bit6所有者有执行权限常量名八进制值16 位二进制所在位含义S_IRWXG000700000 0000 0011 1000bit5~3组权限掩码rwx 三位全 1S_IRGRP000400000 0000 0010 0000bit5组有读权限S_IWGRP000200000 0000 0001 0000bit4组有写权限S_IXGRP000100000 0000 0000 1000bit3组有执行权限常量名八进制值16 位二进制所在位含义S_IRWXO000070000 0000 0000 0111bit2~0其他人权限掩码rwx 三位全 1S_IROTH000040000 0000 0000 0100bit2其他人有读权限S_IWOTH000020000 0000 0000 0010bit1其他人有写权限S_IXOTH000010000 0000 0000 0001bit0其他人有执行权限前面一篇说到open和mkdir这两个函数其实他有两种形式int open(const char *pathname, int flags);int open(const char *pathname, int flags, mode_t mode);int mkdir(const char *pathname, mode_t mode);这里的模式和这里的模式是一样的有所有者所属组其他人的权限每个三位分别为读权限写权限运行权限已知3位二进制对应1位8进制所以我们可以给open的模式写为0666代表大家都能读和写但是我们真的这么写之后发现文件的权限为0644这是因为你的系统为了安全将你给的权限~umaskumask是022之后的结果为0644让用户统一控制所有程序创建的文件权限防止程序创建权限过大的文件。所以在open时如果是创建普通文件给0666即可创建可执行文本才给0777。而对于文件夹就必须包含可执行为x因为没有x就没办法进入这个文件夹都进不去文件夹了就没办法在这个文件夹里面创建文件了所以一般mkdir时给0777。二、Linux文件基础知识1.文件构成Linux系统中一个文件由目录项(struct dirent)、inode表和数据块组成。目录项包括文件名和inode节点号Inode表包含文件的一些信息。例如inode号文件类型文件大小等。数据块文件具体内容存放的地方。当我们查看一个文件的时候首先根据文件名找到我们目录项中的inode号通过inode号进入我们inode表中查找到该文件中一些信息。然后通过inode表中的保存的数据区的指针读取我们相应数据区的内容。2.硬链接本质上就是给文件起了个别名Linux系统中规定只有在文件的打开次数为0即文件这个时候没有打开并且文件的硬连接数为0此时文件才会被删除硬链接与源文件直接关联。修改一个另一个同时被修改。删除一个另一个不会有影响。特点:不占用硬盘空间不能对目录操作不能跨文件系统。命令ln 源文件名 硬链接文件名3.软链接类似于我们windows的快捷方式用来记录我们目标的路径特点占用磁盘空间可以对目录操作可以跨文件系统。命令ln -s 源文件 软链接文件硬链接和软链接的区别1硬链接原文件和新文件的inode编号一致。而软链接不一样。2对原文件删除会导致软链接不可用,因为软连接存储是路径而硬链接不受影响4.常用函数1struct passwd *getpwuid(uid_t uid);可以uid编号转化为文件所有者名getpwuid(uid_t uid)-pw_name2struct group *getgrgid(gid_t gid);将gid转化为组名。文件编程就这么多东西简单来说就是标准IO文件IO对文件打开读写关闭的操作以及读写指针的定位和文件夹的参数。也不算难就是记忆的东西比较多有时间的话可以好好背一下。
返回列表