首先看到了书中在函数形参声明中出现了restrict这个关键字,先来看一下它是什么,有什么功能。
restrict是c99标准引入的,它只可以用于限定和约束指针,并表明指针是访问一个数据对象的唯一且初始的方式.即它告诉编译器,所有修改该指针所指向内存中内容的操作都必须通过该指针来修改,而不能通过其它途径(其它变量或指针)来修改;这样做的好处是,能帮助编译器进行更好的优化代码,生成更有效率的汇编代码.如 int *restrict ptr, ptr 指向的内存单元只能被 ptr 访问到,任何同样指向这个内存单元的其他指针都是未定义的,直白点就是无效指针。restrict 的出现是因为 C 语言本身固有的缺陷,C 程序员应当主动地规避这个缺陷,而编译器也会很配合地优化你的代码.
笔记中函数①
stat函数的声明
int stat(const char *restrict pathname,struct stat *restrict buf);
函数名:stat
功能:若给出一个文件的路径,stat函数将返回与此文件有关的信息结构
参数:第一个参数是pathname(字符串类型)即文件路径;第二个参数是buf,它是一个指针,指向的是我们必须提供的结构——我们声明一个buf变量,它是stat结构体变量,该结构体内部成员项并未赋初值,通过stat函数将buf指向的结构体变量成员项填充(其实就是返回了指定文件的文件信息及属性)。
返回值:这里的返回值不同于上述功能的函数返回,因为stat函数被声明为int类型它要返回整形值,在函数执行成功时返回0,出错返回-1。
函数②
函数的声明
int fstat(int fd, struct stat *buf);
函数名:fstat
功能:获得文件描述符fd上打开文件的有关信息。
参数:第一个参数是fd(非负整数),是文件描述符;第二个参数是buf指针,指向stat结构体。
返回值:函数被声明为int类型,则返回值为整形。在函数执行成功时返回0,出错返回-1。
函数③
函数的声明
int lstat(const char *restrict pathname,struct stat *restrict buf);
函数名:lstat
功能:类似于stat,但是当命名的文件是一个符号链接时,lstat返回该符号链接的有关信息,而不是由该符号链接引用的文件的信息。
参数:与stat参数的声明和作用相同。
返回值:函数被声明为int类型,则返回值为整形。在函数执行成功时返回0,出错返回-1。
函数④
函数声明
int fstatat(int fd,const char *restrict pathname,struct stat *restrict buf int flag);
函数名:fstatat
功能:为一个相对于当前打开目录的路径名返回文件统计信息。
参数:第一个参数是fd文件描述符,如果它的值是宏定义的AT_FDCWD并且pathname参数是一个相对路径,则fstatat会计算相对于当前目录的pathname参数。如果pathname是一个绝对路径,fd参数就会被忽略。第三个参数flag是控制着是否跟随着一个符号链接,当AT_SYMLINK_NOFOLLOW标志被设置时,fstatat不会跟着符号链接。
返回值:函数被声明为int类型,则返回值为整形。在函数执行成功时返回0,出错返回-1。
函数⑤
函数声明
mode_t umask(mode_t cmask);
函数名:umask
功能:umask意思是掩码,按书上讲的功能是这个函数为进程设置文件模式创建屏蔽字,并返回之前的值(没有出错返回)。有点难理解,其实按照老师上课讲的,意思就是从原始权限拿掉(禁)一些权限。
参数:参数cmask是书中图4-6中列出的九个常量(S_IRUSR、S_IWUSR、S_IXUSR、S_IRGRP、S_IWGRP、S_IXGRP、S_IROTH、S_IWOTH、S_IXOTH)中的若干个按位"或"构成的。
在文件模式创建屏蔽字中为1的位,在文件mode中的相应位一定被关闭。
返回值:先看mode_t,这种方式都是类型别名,typedef int mode_t 实际上就是int类型,返回值是文件模式创建屏蔽字。
函数⑥
函数声明
int open(const char *path,int oflag,.../* mode_t mode*/);
函数名:open
功能:打开或创建一个文件
参数:第一个参数是字符串path,是要打开或创建文件的名字;第二个参数oflag可用来说明此函数的多个选项用一个或多个在<fcnt1.h>中的宏定义的常量进行"或"运算构成oflag参数;第三个参数写为". . .",ISO C用这种方法表明余下的参数的数量及其类型是可变的,对于open函数来说,仅当创建新文件时才使用最后这个参数,代表文件权限。
返回值:首先,该函数被定义为int类型,返回值也肯定是整形值,在这里该函数返回的是文件描述符,若成功,函数返回的是文件描述符,失败返回-1
函数⑦
函数声明
int openat(int fd,const char *path,int oflag,. . ./*mode_t mode*/);
函数名:openat
函数功能:
①让线程可以使用相对路径名打开目录中的文件,而不再只能打开当前工作目录。
②可以避免TOCTTOU错误。
参数:与open函数的区别是openat函数多了一个fd文件描述符参数,作用有三个:
①如果path指定的是绝对路径名,在这种情况下,fd参数被忽略,openat函数就相当于open函数。
②如果path参数指定的是相对路径名,则fd参数指出了相对路径名在文件系统中的开始地址。fd参数是通过打开相对路径名所在的目录来获取。
③如果path参数指定了相对路径名,fd参数具有特殊值AT——FDCWD。在这种情况下,路径名在当前目录中获取,openat函数在操作上于open函数类似。
返回值:若成功,函数返回的是文件描述符,失败返回-1
函数⑧
函数声明:
int create(const char *path,mode_t mode);
函数名:create
功能:创建一个新文件
参数:第一个参数path是要创建的文件的名字;第二个参数与open里面的第三个参数相同,权限设置。
返回值:若成功,返回值为只写打开的文件描述符;若出错,返回-1
函数⑨
函数声明
int access(const char *pathname,int mode);
函数名:access
功能:按实际用户ID和实际组ID进行访问权限测试。
参数:pathname是文件路径;mode是测试文件权限,有三个宏定义的值(R_OK|W_OK|XOK),都想用的话就是用“或”操作||_。
返回值:若成功,返回0;若出错,返回-1。
函数⑩
函数声明
int chown(const char *pathname,uid_t owner,gid_t group);
函数名:chown
函数功能:用于改变文件的用户ID和组ID。
参数:第一个参数是pathname,文件路径;第二个参数是owner用户ID,uid_t是typedef int uid_t是int类型的别名gid_t也是如此;第三个参数是组ID;如果后面两个参数中的任意一个是-1,则对应的ID不变。
返回值:若成功,返回0;若出错,返回-1。
函数⑾
函数声明
int chmod(const char *pathname,mode_t mode);
函数名:chmod
函数功能:更改文件的访问权限
参数:第一个参数是pathname文件路径;第二个参数是mode,也是宏定义的int值,代表权限。
返回值:若成功,返回0;若出错,返回-1
函数⑿
函数声明
int truncate(const char *pathname,off_t length);
函数名:truncate
函数功能:截去文件中的一些数据以缩短文件
参数:第一个参数pathname是文件路径;第二个参数length是int类型,用作文件截断的长度。
返回值:若成功,返回0;若出错,返回-1
函数⒀
函数声明
int funtimes(int fd,const struct timespec times[2]);
函数名:funtimes
函数功能:可以改变一个文件的访问和修改实践
参数:第一个参数是fd,文件描述符;第二个文件时结构体数组,
times数组参数的第一个元素包含访问时间,第二个元素包含修改时间。这两个时间值是日历时间。(创建时间没法改,修改时间要有修改权限)
返回值:若成功,返回0;若出错,返回-1
函数⒁
函数声明
int fsync(int fd);
函数名:fsync
函数功能:实现延迟写入磁盘(有写缓存),保证磁盘上实际文件系统与缓冲区中的内容一致。fsync函数只对由文件描述符fd指定的一个文件起作用,并且等待写磁盘操作结束才返回。fsync可用于数据库这样的应用程序,这种应用程序需要确保修改过的块立即写到磁盘上。
参数:只有一个参数fd文件描述符。
返回值:若成功,返回0;若出错,返回-1
函数⒂
函数声明
int fdatasync(int fd);
函数名:fdatasync
函数功能:功能类似于fsync,但它只影响文件的数据部分。而除数据外,fsync还会同步更新文件的属性。
参数只有一个参数fd文件描述符。
返回值:若成功,返回0;若出错,返回-1
函数⒃
函数声明
void sync(void);
函数名:sync
函数功能:sync函数只是将所有修改过的块缓冲区排入写队列,然后就返回,它并不等待实际写磁盘操作结束。通常,称为update的系统守护进程周期性地调用(一般每隔30s)sync函数。这就保证了定期冲洗(flush)内核的块缓冲区。
参数:无参
返回值:若成功,返回0;若出错,返回-1