文件管理相关系统编程(3)

#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#define BUFFER_SIZE 409600
int printfilestat(int fd, struct stat *buf) {
    int results = fstat(fd, buf);
    if (results == -1) {
        perror("文件属性获取失败");
        return -1;
    }
    printf("文件连接数是=%d\n", buf->st_nlink);
    return 0;
}
int main() {
    int fd = open("linkfile",  O_RDWR, 0777);
    if (fd == -1) {
        perror("文件打开失败");
        return -1;
    }
    struct stat buf;
    printfilestat(fd, &buf);
    if (link("linkfile", "newlinkfile") == 0) {
        puts("链接文件创建成功");
    }
    printfilestat(fd, &buf);
    if (unlink("newlinkfile") == 0) {
        puts("newlinkfile文件删除成功");
    }
    printfilestat(fd, &buf);
    if (unlink("linkfile") == 0) {
        puts("linkfile文件删除成功");
    }
    printfilestat(fd, &buf);
    sleep(30);
    close(fd);
    puts("关闭文件!");
    sleep(-1);
    return 0;
}

控制台输出

文件连接数是=1

链接文件创建成功

文件连接数是=2

newlinkfile文件删除成功

文件连接数是=1

linkfile文件删除成功

文件连接数是=0

è虽然文件连接数为0 但是文件数据没有被删除,需要等待所有进程都close该文件才会被从磁盘删除

tkf@tkf:~/workspace/FileOperator$ ll linkfile ;df ./

-rwxrwxr-x 1 tkf tkf 4096005月9 16:34linkfile*

文件系统1K-blocks已用可用已用% 挂载点

/dev/sda128768380 17972780931121266% /

执行程序

tkf@tkf:~/workspace/FileOperator$ df ./

文件系统1K-blocks已用可用已用% 挂载点

/dev/sda128768380 17972784931120866% /

linkfile, newlinkfile文件符号连接删除,因此可用资源变多了

sleep(30)

tkf@tkf:~/workspace/FileOperator$df ./

文件系统1K-blocks已用可用已用% 挂载点

/dev/sda128768380 17972344931164866% /

执行了close,因此在无进程来接到数据,所以文件数据被释放,可用资源再一次变多了

symlink|readlink

创建一个软链接

int symlink (constchar *__from, constchar *__to)

返回值:成功返回0,失败返回-1

打开软链接文件

ssize_t readlink (constchar *__restrict __path,

char *__restrict __buf, size_t __len)

返回值:成功返回0,失败返回-1

文件状态和属性

获取文件状态
Int fstat(文件标识符,struct stat *buf)

Int lstat(文件路径,struct stat *buf)

Int stat(文件路径,struct stat *buf)

文件路径:绝对路径与相对路径均可

文件标识符:文件创建或打开时返回的文件标示符

struct stat *buf:文件属性结构体

返回值:成功返回0,失败返回-1

说明:stat和lstat的区别:当文件是一个符号链接时,lstat返回的是该符号链接本身的信息;而stat返回的是该链接指向的文件的信息

stat 结构体成员意义
struct stat {

dev_t      st_dev;  文件所在设备的ID

ino_t      st_ino;  与该文件关联的inode

mode_t      st_mode; 

nlink_t    st_nlink;  /* 链向此文件的连接数(硬连接)*/

uid_t      st_uid;  文件属主的UID号

gid_t      st_gid;    文件属主的GID号

dev_t      st_rdev;    设备号,针对设备文件

off_t      st_size;    文件大小

blksize_t  st_blksize; 系统块的大小(IO缓冲区适合大小)

blkcnt_t    st_blocks; 文件所占块数

time_t      st_atime;

time_t      st_mtime; 

time_t      st_ctime; 

}

st_mode 标志

文件类型标志:

S_IFBLK:文件是一个特殊的块设备

S_IFDIR:文件是一个目录

S_IFCHR:文件是一个特殊的字符设备

S_IFIFO:文件是一个FIFO设备

S_IFREG:文件是一个普通文件(REG即使regular啦)

S_IFLNK:文件是一个符号链接

其他模式标志:

S_ISUID: 文件设置了SUID位

S_ISGID:文件设置了SGID位

S_ISVTX:文件设置了SBIT位

用于解释st_mode标志的掩码:

S_IFMT:文件类型

S_IRWXU:属主的读/写/执行权限,可以分成S_IXUSR,S_IRUSR, S_IWUSR

S_IRWXG:属组的读/写/执行权限,可以分成S_IXGRP,S_IRGRP, S_IWGRP

S_IRWXO:其他用户的读/写/执行权限,可以分为S_IXOTH,S_IROTH, S_IWOTH

确定文件类型

S_ISBLK:测试是否是特殊的块设备文件

S_ISCHR:测试是否是特殊的字符设备文件

S_ISDIR:测试是否是目录(我估计find .-type d的源代码实现中就用到了这个宏)

S_ISFIFO:测试是否是FIFO设备

S_ISREG:测试是否是普通文件

S_ISLNK:测试是否是符号链接

S_ISSOCK:测试是否是socket

文件权限

umask

设置文件权限屏蔽字

mode_t umask (mode_t __mask)

chmod|lchmod|fchmod

设置文件权限

int chmod (constchar * file, __mode_tmode)

int lchmod (constchar * file, __mode_tmode)

int fchmod (int fd, mode_tmode)

chown|fchown|lchown

设置文件所属用户及用户组

int chown (constchar *__file, __uid_t __owner, __gid_t__group)

int fchown (int __fd, __uid_t __owner, __gid_t __group) _

int lchown (constchar *__file, __uid_t __owner, __gid_t __group)

目录操作

创建目录
Int mkdir(路径,权限)

路径:绝对路径相对路径均可

权限:以数字形式表示的权限

返回值:成功返回0,失败返回-1

进入|获取工作目录

进入工作目录
Int chdir(路径)

路径:绝对路径相对路径均可

返回值:成功返回0,失败返回-1

Int fchdir(intfiledes)

返回值:成功返回0,失败返回-1

获取工作目录
char *getcwd (char *__buf, size_t __size)

返回值:当前工作目录

子目录流操作

打开目录,获得子目录流指针

DIR*opendir(char *name)

读取子目录

structdirent* readdir((DIR *dirp)

返回子目录流里的当前位置

longint telldir(DIR* drip)

设置子目录流的当前数据项指针

voidseekdir(DIR* drip,long int loc)

关闭子目录流

DIR*opendir(DIR* drip)

删除目录或文件

删除目录:int rmdir(路径)

删除文件:int unlink(路径)

返回值:成功返回1,失败返回-1

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/19069.html