文件的相关操作

修改文件属性

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_ISUID04000设置文件所有者用户的权限
S_ISGID02000设置文件所在用户组的权限
S_ISVTX01000设置粘贴位
S_IRUSR00400设置文件所有者的读权限
S_IWUSR00200设置文件所有者的写权限
S_IXUSR00100设置文件所有者的执行权限
S_IRGRP00040设置用户组的读权限
S_IWGRP00020设置用户组的写权限
S_IXGRP00010设置用户组的执行权限
S_IROTH00004设置其他用户组的读权限
S_IWOTH00002设置其他用户的写权限
S_IXOTH00001设置其他用户的执行权限

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.硬链接

  1. 目录无法创建硬链接,只有文件才可以创建硬链接
  2. 硬链接不能跨越文件系统,即不能为处在不同分区上的文件创建硬链接

#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语言编程实现控制终端以及对串口的读写操作,还可以控制扬声器发声和声卡等外部设备播放音频文件等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值