函数小结
最近用到的Linux函数,小结。
readlink()
会将参数path的符号链接内容存储到参数buf所指的内存空间,返回的内容不是以\000作字符串结尾,但会将字符串的字符数返回,这使得添加\000变得简单。若参数bufsiz小于符号连接的内容长度,过长的内容会被截断,如果 readlink 第一个参数指向一个文件而不是符号链接时,readlink 设 置errno 为 EINVAL 并返回 -1。 readlink()函数组合了open()、read()和close()的所有操作。
==========================================================================
access() 函数
int access(const char * pathname, int mode);
函数说明:
access()会检查是否可读/写某一已经存在的文件。参数mode有几种情况组合,R_OK,W_OK,X_OK 和 F_OK。分别是用来鉴定该文件是否有读权限,写权限,执行权限和判断文件是否存在。由于access()只作权限的核审,并不理会文件状态或文件内容,因此,如果一目录便是可写入,便是可以再该目录中建立新文件等操作,而非意味着此目录可以被当做文件处理,例如,你会发现DOS的文件都具有“可执行”权限,但用execve()执行会失败。
返回值
若所有欲检查核的权限都通过了检查则返回0值,表示成功,只要有一权限被禁止则返回-1.
==========================================================================
EnterCriticalSection函数和LeaveCriticalSection函数
CRITICAL_SECTION cs;
EnterCriticalSection(&cs);
cs表示是一个全局锁,并且 EnterCriticalSection()函数的作用是加锁,而之后的代码处理过程是不允许其他线程进行操作,除非遇到LeaveCriticalSection。
EnterCriticalSection()函数的作用是多个线程操作相同的数据时,一般是需要按顺序访问的,否则会导致数据错乱,无法控制数据,变成随机变量。为了解决这个问题,引入了一个全局互斥量,让每个线程按照顺序的访问变量,并且在每个EnterCriticalSection()函数加锁之后,而后的代码处理过程是不允许其他线程进行操作的,除非遇到LeaveCriticalSection函数。
==========================================================================
stat()函数
表头文件: #include <sys/stat.h>
函数定义: int stat(const char *file_name, struct stat *buf);
函数说明: 通过文件名filename获取文件信息,并保存在buf所指的结构体stat中
返回值: 执行成功则返回0,失败返回-1,错误代码存于errno(需要include <errno.h>)
stat结构体的定义是
struct stat { dev_t st_dev; //文件的设备编号 ino_t st_ino; //节点 mode_t st_mode; //文件的类型和存取的权限 nlink_t st_nlink; //连到该文件的硬连接数目,刚建立的文件值为1 uid_t st_uid; //用户ID gid_t st_gid; //组ID dev_t st_rdev; //(设备类型)若此文件为设备文件,则为其设备编号 off_t st_size; //文件字节数(文件大小) unsigned long st_blksize; //块大小(文件系统的I/O 缓冲区大小) unsigned long st_blocks; //块数 time_t st_atime; //最后一次访问时间 time_t st_mtime; //最后一次修改时间 time_t st_ctime; //最后一次改变时间(指属性) };
错误返回:
errno错误代码:
ENOENT 参数file_name指定的文件不存在
ENOTDIR 路径中的目录存在但却非真正的目录
ELOOP 欲打开的文件有过多符号连接问题,上限为16符号连接
EFAULT 参数buf为无效指针,指向无法存在的内存空间
EACCESS 存取文件时被拒绝
ENOMEM 核心内存不足
ENAMETOOLONG 参数file_name的路径名称太长
stat例子:
#include <sys/stat.h> #include <stdio.h> #include <errno.h> int main() { struct stat buf; int res = stat("test.txt", &buf); if(res != 0) { printf("stat file fail!\n"); printf("%d\n", errno); } return 0; }