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 directorySYNOPSIS
#include <unistd.h> 空目录int rmdir(const char *pathname);
返回值 成功返回0
失败返回-1 同时errno被设置
NAME
remove - remove a file or directorySYNOPSIS
#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 statusSYNOPSIS
#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.写一个函数 打印文件的类型 读写权限 硬链接数 文件大小