struct stat
{
mode_t st_mode; //权限位
ino_t st_ino; //i-node number
dev_t st_dev;
dev_t st_rdev;
nlink_t st_nlink; //number of hard links
uid_t st_uid;
gid_t st_gid;
off_t st_size; //普通文件长度(byte)
struct timespec st_atime;
struct timespec st_mtime;
struct timespec st_ctime;
blksize_t st_blksize; //以block块(4094byte)计数
blkcnt_t st_blocks; //以扇区(512byte)计数
}
st_mode 参数详解
函数说明
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(char *pathName, int oflg, /* mode_t mode */); 返回文件描述符
#include <unistd.h>
int close(int fd); 关闭文件
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count); 从fd中读取count个字节放在以内存首地址为buf上,
成功返回读取到的字节数,读到文件末尾返回0。失败返回-1,
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count); 把内存以 buf为首地址,count个字节写进fd中,
返回写成功的字节数。
#include <sys/types.h>
#include <sys/stat.h>
mode_t umask(mode_t mask); 更改uamsk的值。
最大文件打开个数
系统最大文件打开个数 cat /proc/sys/fs/file-max
默认最大文件打开个数 ulimit -a
更改默认最大文件打开个数 ulimit -n 4096
#include <errno.h>
void perror(const char *s); 打印出错信息
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
#include <fcntl.h>
int fcntl(int fd, int cmd, ... /* int arg */); 改变已经打开的文件的访问控制属性
#include <unistd.h>
#include <sys/ioctl.h>
int ioclt(int fd, int request, ...); 向设备文件发送控制或配置指令,更改一些物理访问控制属性杂项函数。
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat(cost char *path, struct stat *buf); 主要功能获取文件的inode属性。
int fstat(int fd, struct stat *buf);
int lstat(const char *path, struct stat *buf); 不跟随符号链接,返回符号链接的有关信息,二不是符号链接所引用的文件信息
#include <unistd.h>
int access(const char*pathname, int mode); 按实际UID、GID,跟踪符号链接。测试一个文件是否有访问权限,
成功返回0;出错,返回-1
mode参数:
R_OK:读权限
W_OK:写权限
X_OK:执行权限
F_OK:是否存在
#include <sys/stat.h>
int chmod(const char *path, mode_t mode); 改变权限
#include <unistd.h>
int unlink(const char *pathname); 功能:(1)如果是符号链接,删除符号链接
(2)如果是硬链接,硬链接个数减1,
(3)如果硬链接为0,但有进程已打开该文件,
并持有文件描述符,则等进程关闭该文件时,
kernel 才真正去删除该文件
(4)利用该特性创建临时文件,
先open() 或 creat() 创建一个文件,
马上unlink()此文件
硬链接不允许跨文件系统,而POSIX可以跨文件系统,
目录不可以创建硬链接,因为给目录创建硬链接会形成死循环
#include <unistd.h>
int chdir(const char pathname); 改变当前工作目录
#include<unistd.h>
char *getcwd(char *buf, size_t size); 获取当前工作目录,成功,返回buf;失败,返回NULL
#include <sys/types.h>
#include <sys/stat.h>
int mkdir(const char *pathname, mode_t mode); 创建一个目录
#include <unistd.h>
int rmdir(const char *pathname); 删除一个目录
#include <sys/types.h>
#include <dirent.h>
DIR *opendir(const char *pathname); 打开一个目录
int closedir(DIR *dp); 关闭打开的目录
struct dirent * readdir(DIR *dp); 每次返回一个记录项,然后指向下一个记录项
到达目录末尾,返回NULL,此时不设置errno,
当出错,返回NULL,errno被设置。
void rewinddir(DIR *dp); 将记录项指针重置为指向第一项
long telldie(DIR *dp); 返回当前目录指针在什么位置
void seekdir(DIR *dp, long loc); 设置目录指针位置
- 我的遍历文件层次结构程序
/*
* 在Linux下搜索目录下文件及其子目录文件
* 算法是先进入该目录,找到第一个记录项,查看是否为目录。是,进入该目录并重复上述,不是,返回上级目录
*/
#include <unistd.h>
#include <sys/stat.h>
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
void sys_err(char *funcname);
void showDir(int i);
int main(int argc, char *argv[])
{
if(argc != 2)
{
printf("argc not equal 2.\n");
exit(-1);
}
if(access(argv[1], F_OK) < 0)
sys_err("access()");
if(chdir(argv[1]) < 0)
sys_err("chdir()");
showDir(0);
return 0;
}
void sys_err(char *funcname)
{
perror(funcname);
exit(-1);
}
void showDir(int i)
{
DIR *dirP;
struct dirent *direntP;
struct stat buf;
if((dirP = opendir(".")) == NULL)
sys_err("opendir()");
while((direntP = readdir(dirP)) != NULL)
{
if(direntP->d_name[0] == '.')
continue;
if(lstat(direntP->d_name, &buf) < 0)
sys_err("lstat()");
int j = 0;
for(; j < i; j++)
printf(" ");
printf("%s",direntP->d_name);
if(S_ISDIR(buf.st_mode))
{
printf("/\n");
if(chdir(direntP->d_name) < 0)
sys_err("chdir()");
showDir(i + 1);
}
else
printf("\n");
}
chdir("..");
closedir(dirP);
}