Linux命令【五】

ⅰ亾dé卋堺 提交于 2020-03-17 03:28:50

系统文件函数

stat函数

指针如果没有const一般表示传出参数,如果加const表示传入参数
struct stat

  • dev_t st_dev文件设备编号
  • ino_t st_ino节点
    inode号是唯一的,每个inode节点的大小一般是128字节活着256字节,一般文件每2KB就设置一个inode
  • mode_t st_mode文件类型和存取权限,16bite,4bite文件类型 4bit特殊权限位 3*4bit访问权限
  • nlink_t st_nlink文件的硬链接数目
  • uid_t st_uid用户ID
  • gid_t st_gid组ID
  • dev_t st_rdev若文件为设备文件,则为其设备编号
  • off_t st_size文件字节数
  • blksize_t st_blksize块大小(文件系统的I/O缓冲区大小)
  • blkcnt_t st_blocks快数
  • time_t st_atime最后一次访问时间
  • time_t st_mtime最后一次修改时间
  • time_t st_ctime最后一次改变时间:指属性,包括访问,修改内容,修改类型等

stat函数和lstat函数的区别:对于软链接,前者是穿透(追踪)函数,后者是不穿透(不追踪)函数

access测试文件是否有某种权限

chmod 改变文件权限

可以使用第3章strtol函数将字符串转化为数字

chown 改变文件所有者

可以查看passwd文件(详见手册第5章)

truncate函数

文件的截取和拓展

#include <unistd.h>
#include <sys/types.h>

int truncate(const char *path, off_t length);
int ftruncate(int fd, off_t length);

多出来的方式仍然是以空洞的方式储存

link函数

创建硬链接

#include <unistd.h>

int link(const char *oldpath, const char *newpath);

#include <fcntl.h>           /* Definition of AT_* constants */
#include <unistd.h>

int linkat(int olddirfd, const char *oldpath,
		int newdirfd, const char *newpath, int flags);

symlink 函数

创建软链接

readlink 函数

读一个软链接

unlink 函数

如果是软链接,则删除软链接
如果是硬链接,则删除当前硬链接,硬链接数减一,当减为0时,释放数据块和inode
使用unlink可以制作临时文件:如果文件硬链接数为0,但有进程已经打开文件,并且持有文件描述符,则等该进程关闭文件时kernel才真正删除文件,因此可以先open|creat一个文件,然后再使用文件描述符操作该文件,同时使用unlink函数删去,则创造出了一个临时文件

操作文件的时候需要注意文件指针,尤其是写操作以后想要读取的时候

rename函数

目录操作函数

chdir函数

相当于cd命令,改变的是所在进程的路径,而不是终端的路径

getcwd函数

相当于pwd命令,获取进程当前目录

mkdir函数

需要注意创建的目录需要有执行权限,否则无法进入目录

rmdir函数

删除一个空目录

opendir函数(下面开始变成手册第三章的函数了)

成功返回一个DIR指针,失败返回NULL

readdir函数

读取目录内容,返回一个结构体struct dirent

  • ino_t ino目录的inode
  • ff_t d_off目录文件开头到此目录进入点的位移
  • signed short int d_reclend_name的长度
  • unsigned char d_type 文件的类型

closedir函数

dup 和dup2

查阅手册第二章
用于复制文件描述符,可以让多个文件描述符指向同一个文件

dup(old fd)函数:返回一个文件描述符,指向旧文件描述符所指向的文件,返回的是所有未占用的文件描述符中最小的一个
dup2(old fd,new fd)函数:指向新的文件描述符,如果新文件描述符原本指向一个文件则将该文件释放,再指向旧文件描述符所指向的文件。如果new和old是同一个文件描述符则不会关闭。

虽然可能有多个文件描述符,但是只有一个文件指针

这里的文件覆盖并不是清空,而是在原来文件上面写

fcntl函数

改变已经打开的文件的属性

  • 复制一个现有的文件描述符
  • 获得/设置文件描述符标记
  • 获得/设置文件状态标记
int fcntl(int fd,,int cmd,long arg)

cmd=F_GETFLarg=0就可以,返回文件的状态flag=fcntl(fd,F_GETFL,0)
cmd=F_SETFLarg=flag|O_APPEND/O_NONBLOCK
O_APPEND在末尾追加

  • 获得/设置异步I/O所有权
  • 获得/设置记录锁
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!