栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Linux文件系统相关C函数

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Linux文件系统相关C函数

Linux文件系统
  • 一、目录和文件
      • 获取文件属性和权限
      • 文件权限管理
      • 硬链接和符号链接
      • 目录的创建和销毁
      • 更改当前工作路径
      • 分析目录内容
  • 二、系统数据文件和信息
      • 口令文件
      • 组文件
      • 阴影口令

一、目录和文件 获取文件属性和权限
  • stat()函数获取文件信息

    #include 
    #include 
    #include 
    
    int stat(const char *pathname, struct stat *statbuf);
    int fstat(int fd, struct stat *statbuf);
    int lstat(const char *pathname, struct stat *statbuf);
    
  • stat结构体:

    truct stat
    {
        dev_t     st_dev;     文件使用的设备号
        ino_t     st_ino;         索引节点号 
        mode_t    st_mode;      文件类型和权限
        nlink_t   st_nlink;       文件的硬连接数  
        uid_t     st_uid;         用户识别号
        gid_t     st_gid;        组识别号  
        dev_t     st_rdev;     设备文件的设备号
        off_t     st_size;     以字节为单位的文件容量   
        blksize_t st_blksize;  包含该文件的磁盘块的大小   
        blkcnt_t  st_blocks;   该文件所占的磁盘块  
        time_t    st_atime;    最后一次访问该文件的时间   
        time_t    st_mtime;    /最后一次修改该文件的时间   
        time_t    st_ctime;    最后一次改变该文件状态的时间   
    };
    
  • st_mode如下表,其中15-12 位保存文件类型,11-9 位保存执行文件时设置的信息, 8-0 位保存文件访问权限

     S_IFMT     0170000   bit mask for the file type bit field  (和st_mode按位与使用:xx.st_mode & S_IFMT)
    
     S_IFSOCK   0140000   socket
     S_IFLNK    0120000   symbolic link
     S_IFREG    0100000   regular file
     S_IFBLK    0060000   block device
     S_IFDIR    0040000   directory
     S_IFCHR    0020000   character device
     S_IFIFO    0010000   FIFO
    
     S_ISUID     04000   set-user-ID bit
     S_ISGID     02000   set-group-ID bit (see below)
     S_ISVTX     01000   sticky bit (see below)
     
     S_IRWXU     00700   owner has read, write, and execute permission
     S_IRUSR     00400   owner has read permission
     S_IWUSR     00200   owner has write permission
     S_IXUSR     00100   owner has execute permission
    
     S_IRWXG     00070   group has read, write, and execute permission
     S_IRGRP     00040   group has read permission
     S_IWGRP     00020   group has write permission
     S_IXGRP     00010   group has execute permission
    
     S_IRWXO     00007   others  (not  in group) have read, write, and
                                   execute permission
     S_IROTH     00004   others have read permission
     S_IWOTH     00002   others have write permission
     S_IXOTH     00001   others have execute permission
    
    
    • 粘住位(t位)sticky bit:现在的作用为若目录具有该位,则表示在此目录下的文件只能被该文件所有者、此目录所有者或root来删除或改名。
  • POSIX中定义了检查这些文件类型的宏定义:

     S_ISREG(m)  is it a regular file? 一般文件
    
     S_ISDIR(m)  directory? 目录
    
     S_ISCHR(m)  character device? 字符设备
    
     S_ISBLK(m)  block device? 块设备
    
     S_ISFIFO(m) FIFO (named pipe)? 命名管道
    
     S_ISLNK(m)  symbolic link?  (Not in POSIX.1-1996.) 符号链接
    
     S_ISSOCK(m) socket?  (Not in POSIX.1-1996.) 套接字
    
  • utime()函数可用于修改文件最后读写的时间

    #include 
    #include 
    
    int utime(const char *filename, const struct utimbuf *times);
    
    struct utimbuf {
    	time_t actime;       
    	time_t modtime;      
    };
    
文件权限管理
  • chmod更改文件权限 直接使用shell命令 chmod xxx或函数chmod()更改

    #include 
    
    int chmod(const char *pathname, mode_t mode);
    int fchmod(int fd, mode_t mode);
    
  • umask设置了用户创建文件的默认权限,为权限的“补码”,终端上用umask命令查看,umask xxx可修改,一般默认为0022

  • 所以一般文件的默认权限为0666 & ~022 = 0644, 目录的默认权限为0777 & ~022 = 0755

  • 函数umask()也可修改umask

    #include 
    #include 
    
    mode_t umask(mode_t mask);
    
硬链接和符号链接
  • 硬链接可以看成是指向inode号的路径名,一个inode对应的多个文件名就是若干个硬链接,不能对目录进行创建也不能跨文件系统。硬链接数为0文件节点才会真正被释放。可以用命令ln创建或者函数link()创建,unlink删除硬链接。

    #include 
    
    int link(const char *oldpath, const char *newpath);
    int unlink(const char *pathname);
    
  • 符号连接与windows下的快捷方式类似,实际上是一个文本文件,其中包含的有另一文件的位置信息。可以用命令ln -s创建

目录的创建和销毁
  • 使用命令mkdir或函数mkdir()创建一个目录

    #include 
    #include 
    
    int mkdir(const char *pathname, mode_t mode);
    
  • 使用命令rmdir或函数rmdir()(为空时才能成功)删除一个目录

    #include 
    
    int rmdir(const char *pathname);
    
更改当前工作路径
  • 使用命令cd或函数chdir更改工作路径

    #include 
    
    int chdir(const char *path);
    int fchdir(int fd);
    
  • 使用命令pwd或函数getcwd()得到工作路径

    #include 
    
    char *getcwd(char *buf, size_t size);	
    char *getwd(char *buf);	
    char *get_current_dir_name(void);
    
分析目录内容
  • glob()函数解析目录,flags能选择匹配模式,errfunc查看错误信息可置为NULL。

    #include 
    
    int glob(const char *pattern, int flags,
             int (*errfunc) (const char *epath, int eerrno),
             glob_t *pglob);
    void globfree(glob_t *pglob);
    
    typedef struct {
    	size_t   gl_pathc;     
    	char   **gl_pathv;    
    	size_t   gl_offs;     
    } glob_t;
    
  • 例如用glob()查看etc下的隐藏文件

    #include 
    #include 
    #include 
    
    #define PAT "/etc/.*"  
    
    int main()
    {
    	glob_t globres;
    	int i,err;
    
    	err = glob(PAT,0,NULL,&globres);
    	if(err)
    	{
    		printf("Error code = %dn",err);
    		exit(1);
    	}
    
    	for(i = 0; i < globres.gl_pathc; i++)
    		puts(globres.gl_pathv[i]);
    
    	globfree(&globres);   //释放globres
    	
    	return 0;	
    }	
    
  • 或者用目录流的方式进行操作:

    #include 
    #include 	
    DIR *opendir(const char *name);
    DIR *fdopendir(int fd);
    
    #include 
    struct dirent *readdir(DIR *dirp);
    int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);
    struct dirent {
        ino_t          d_ino;       
        off_t          d_off;       
        unsigned short d_reclen;    
        unsigned char  d_type;      
        char           d_name[256]; 
    };
    
    #include 
    #include 	
    void rewinddir(DIR *dirp);
    
    #include 
    void seekdir(DIR *dirp, long loc);
    
    #include 
    long telldir(DIR *dirp);
    
    #include 
    #include 
    int closedir(DIR *dirp);
    
二、系统数据文件和信息 口令文件
  • /etc/passwd文件存储用户的帐户信息,getpwnam()可查询用户相关信息

    #include 
    #include 
    
    struct passwd *getpwnam(const char *name);
    
    struct passwd *getpwuid(uid_t uid);
    
    int getpwnam_r(const char *name, struct passwd *pwd,
                   char *buf, size_t buflen, struct passwd **result);
    
    int getpwuid_r(uid_t uid, struct passwd *pwd,
                   char *buf, size_t buflen, struct passwd **result);
    
    struct passwd {
        char   *pw_name;       
        char   *pw_passwd;     
        uid_t   pw_uid;        
        gid_t   pw_gid;        
        char   *pw_gecos;      
        char   *pw_dir;        
        char   *pw_shell;      
    };
    
组文件
  • /etc/group文件中记录了用户所属的主组,getgrnam()可查组相关信息

     #include 
     #include 
    
     struct group *getgrnam(const char *name);
    
     struct group *getgrgid(gid_t gid);
    
     int getgrnam_r(const char *name, struct group *grp,
               char *buf, size_t buflen, struct group **result);
    
     int getgrgid_r(gid_t gid, struct group *grp,
               char *buf, size_t buflen, struct group **result);
    
    struct group {
        char   *gr_name;        
        char   *gr_passwd;      
        gid_t   gr_gid;         
        char  **gr_mem;         
    };
    
阴影口令
  • /etc/shadow 文存储 了Linux 系统中用户的密码信息,用下面函数可对密码操作

    #include 
    
    struct spwd *getspnam(const char *name);	//指定一个用户名,返回用户信息
    struct spwd *getspent(void);	//打开影子文件并按顺序读取各项
    void setspent(void);	//回到影子文件开头
    void endspent(void); //关闭影子文件
    struct spwd {
        char *sp_namp;     
        char *sp_pwdp;     
        long  sp_lstchg;   
        long  sp_min;      
        long  sp_max;      
        long  sp_warn;     
        long  sp_inact;    
        long  sp_expire;   
        unsigned long sp_flag;  
    };
    
    #define _XOPEN_SOURCE       
    #include 
    
    char *crypt(const char *key, const char *salt);//crypt()算法会接受一个最长可达8字符的密钥(即key),并施以数据加密算法(DES)的一种变体。salt参数指向一个两个字符的字符串,用来扰动(改变)DES算法。该函数返回一个指针,指向长度13个字符的字符串。编译时链接crypt库。
    
    #include 
    
    char *getpass(const char *prompt);//关闭回显,读取一行字符串返回并打印prompt
    
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/995767.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号