函数小结

最近用到的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;
}

 

posted on 2016-07-31 10:05  `Elaine  阅读(180)  评论(0编辑  收藏  举报

导航