修改文件属性
1.改变文件的所有者
#include<sys/types.h>
#include<unistd.h>
int chown(const char* pathname , uid_t owner , gid_t group);
int fchown(int fd , uid_t owner , gid_t group);
这两个函数调用成功时,返回为0;调用失败时,返回为-1,并设置相应errno
2.改变文件的访问权限
#include<sys/types.h>
#include<sys/stat.h>
int chmod(const char* path , mode_t mode);
int fchmod(int fildes , mod_t mode);
宏定义 | 八进制 | 说明 |
S_ISUID | 04000 | 设置文件所有者用户的权限 |
S_ISGID | 02000 | 设置文件所在用户组的权限 |
S_ISVTX | 01000 | 设置粘贴位 |
S_IRUSR | 00400 | 设置文件所有者的读权限 |
S_IWUSR | 00200 | 设置文件所有者的写权限 |
S_IXUSR | 00100 | 设置文件所有者的执行权限 |
S_IRGRP | 00040 | 设置用户组的读权限 |
S_IWGRP | 00020 | 设置用户组的写权限 |
S_IXGRP | 00010 | 设置用户组的执行权限 |
S_IROTH | 00004 | 设置其他用户组的读权限 |
S_IWOTH | 00002 | 设置其他用户的写权限 |
S_IXOTH | 00001 | 设置其他用户的执行权限 |
3.改变文件的名称
#include<stdio.h>
int rename(const char* oldpath , const char* newpath);
4.改变文件的长度
#include<unistd.h>
int truncate(const char* path , off_t length);
int ftruncate(int fd , off_t length);
复制文件描述符
#include<unistd.h>
int dup(int oldfd);
int dup2(int oldfd , int newfd);
获取文件信息(大小、权限、id、更改日期)
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
int stat(const char* path , struct stat* buf);
int fstat(int fd , struct stat* buf);
int lstat(const char*path , struct stat* buf);
stat读取链接指向文件的属性,lstat读取链接本身的属性
struct stat {
mode_t st_mode; //文件对应的模式,文件,目录等
ino_t st_ino; //inode节点号
dev_t st_dev; //设备号码
dev_t st_rdev; //特殊设备号码
nlink_t st_nlink; //文件的连接数
uid_t st_uid; //文件所有者
gid_t st_gid; //文件所有者对应的组
off_t st_size; //普通文件,对应的文件字节数
time_t st_atime; //文件最后被访问的时间
time_t st_mtime; //文件内容最后被修改的时间
time_t st_ctime; //文件状态改变时间
blksize_t st_blksize; //文件内容对应的块大小
blkcnt_t st_blocks; //伟建内容对应的块数量
};
stat结构体中的st_mode 则定义了下列数种情况:
S_IFMT 0170000 文件类型的位遮罩
S_IFSOCK 0140000 scoket
S_IFLNK 0120000 符号连接
S_IFREG 0100000 一般文件
S_IFBLK 0060000 区块装置
S_IFDIR 0040000 目录
S_IFCHR 0020000 字符装置
S_IFIFO 0010000 先进先出
S_ISUID 04000 文件的(set user-id on execution)位
S_ISGID 02000 文件的(set group-id on execution)位
S_ISVTX 01000 文件的sticky位
S_IRUSR(S_IREAD) 00400 文件所有者具可读取权限
S_IWUSR(S_IWRITE)00200 文件所有者具可写入权限
S_IXUSR(S_IEXEC) 00100 文件所有者具可执行权限
S_IRGRP 00040 用户组具可读取权限
S_IWGRP 00020 用户组具可写入权限
S_IXGRP 00010 用户组具可执行权限
S_IROTH 00004 其他用户具可读取权限
S_IWOTH 00002 其他用户具可写入权限
S_IXOTH 00001 其他用户具可执行权限
上述的文件类型在POSIX中定义了检查这些类型的宏定义:
S_ISLNK (st_mode) 判断是否为符号连接
S_ISREG (st_mode) 是否为一般文件
S_ISDIR (st_mode) 是否为目录
S_ISCHR (st_mode) 是否为字符装置文件
S_ISBLK (s3e) 是否为先进先出
S_ISSOCK (st_mode) 是否为socket
文件的其他操作
1.将缓冲区数据写回磁盘
#include<unistd.h>
int fsync(int fd);
2.锁定文件
系统调用函数flock()主要实现了对文件做各种锁定或解锁的操作
#include<sys/file.h>
int flock(int fd , int operation);
参数operation有如下取值情况:
- LOCK_SH:建立共享锁定。多个进程可同时对一个文件进行共享锁定
- LOCK_EX:建立互斥锁定。一个文件只有一个互斥锁定。
- LOCK_UN:解除文件锁定状态
- LOCK_NB:当无法建立锁定时,此操作可不被阻断,马上返回进程。其通常与LOCK_SH或LOCK_EX作或|运算
单一的文件无法同时建立共享锁定和互斥锁定,当使用dup()函数复制文件描述符,或者调用fork()函数创建子进程时,文件描述符不会继承此种锁定
特殊文件的操作
目录文件的操作
1.获取当前的工作目录
#include<unistd.h>
char* getcwd(char *buf , size_t size);
2.更改当前的工作目录
#int chdir(const char* path);
int fchdir(int fd);
3.创建和删除目录
#include<sys/stat.h>
#include<sys/types.h>
int mkdir(const char* pathname , mode_t mode);
mode指创建目录的访问权限(该值取决于(mode&~umask&0777)的值
#include<unistd.h>
int rmdir(const char *pathname);
4.打开与关闭文件
#include<sys/types.h>
#include<dirent.h>
DIR*opendir(const char *name);
int closedir(DIR*dir);
5.读取目录文件
#include<sys/type.h>
#include<dirent.h>
struct dirent* readdir(DIR* dir);
struct dirent
{
ino_t d_ino; /*此目录进入点的索引号inode*/
off_t d_off; /*目录文件开头到此目录进入点的位移*/
unsigned short d_reclen; /*目录名长度,不包括NULL字符*/
unsigned char d_type; /*文件的类型*/
char d_dname[256]; /*文件名*/
}
链接文件的操作
1.硬链接
- 目录无法创建硬链接,只有文件才可以创建硬链接
- 硬链接不能跨越文件系统,即不能为处在不同分区上的文件创建硬链接
#include<unistd.h>
int link(const char* oldpath , const char* newpath);
int unlink(const char* pathname);
2.符号链接
一旦源文件删除,那么符号链接文件就会无效
#include<unistd.h>
int symlink(const char* oldpath , const char* newpath);
ssize_t readlink(const char* path , char* buf , size_t bufsiz); /*打开一个已经存在的符号链接,并获取该文件的名称*/
删除一样使用unlink
设备文件
Linux系统与Windows系统不同,它将设备当作文件来操作。因此,在Linux系统中,对文件的读写等操作都可以应用到设备文件中,可以把设备文件当作普通文件来处理。在访问外部设备时,不需系统提供一种标准接口与外部设备相关联,只需要像访问普通文件一样来访问设备文件。
在Linux中,很多东西都是以文件的形式存在的,因此设备文件存在一个抽象化的设备目录,如/dev,关于文件的读写,或者控制等操作,都可以应用到设备文件上。但是,有个别的外部设备文件在操作时需要特别注意,如串口和声卡等外部设备
在Linux系统下,不仅可以通过C语言编程实现控制终端以及对串口的读写操作,还可以控制扬声器发声和声卡等外部设备播放音频文件等。