当前位置: 首页 > 编程日记 > 正文

apue学习之文件IO第二部分

学习apue课程已经有一个多月了,有很多知识点需要自己去总结:

下面是主要的几个函数的介绍:

1-stat()函数是获得文件的主要信息。在linux当中主要以一个结构体来保存文件的信息,其中每一个字段都代表着文件的一个信息量:

struct stat {dev_t     st_dev;     /* ID of device containing file */ ino_t     st_ino;     /* inode number */mode_t    st_mode;    /* protection */   /*文件的权限状态值,是一个数值*/nlink_t   st_nlink;   /* number of hard links */uid_t     st_uid;     /* user ID of owner */gid_t     st_gid;     /* group ID of owner */dev_t     st_rdev;    /* device ID (if special file) */off_t     st_size;    /* total size, in bytes */   /* 文件所占的磁盘空间的大小 */blksize_t st_blksize; /* blocksize for file system I/O */blkcnt_t  st_blocks;  /* number of 512B blocks allocated */time_t    st_atime;   /* time of last access */time_t    st_mtime;   /* time of last modification */time_t    st_ctime;   /* time of last status change */   /* 最后一次修改的状态*/};

在使用这个结构体的时候我们会用到许多的宏定义,比如st_mode的值要做一些判断。详细的介绍请参照man手册对此函数的定义。

stat()函数:

stat, fstat, lstat - get file status
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>int stat(const char *path, struct stat *buf);
int fstat(int fd, struct stat *buf);
int lstat(const char *path, struct stat *buf);
//主要使用stat()函数

2-opendir

       opendir, fdopendir - open a directory#include <sys/types.h> #include <dirent.h>DIR *opendir(const char *name);DIR *fdopendir(int fd);

打开一个目录,返回一个文件指针,DIR *dir ; 返回的结果记录着目录的信息,一般和readdir搭配使用做为其参数。

3-readdir

NAMEreaddir, readdir_r - read a directory   //读取一个目录SYNOPSIS#include <dirent.h>struct dirent *readdir(DIR *dirp);
int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);

读取一个目录,每次只能读一个目录的信息,readdir()参数为opendir返回的文件指针DIR* dir ,返回值为一个结构体struct dirent *指针类型。

这个结构体如下:

主要包括着目录的信息:

linux当中一切都为文件,那么目录也是属于一种文件,所以stat对其也是适用的。

 struct dirent {ino_t          d_ino;       /* inode number */off_t          d_off;       /* offset to the next dirent */unsigned short d_reclen;    /* length of this record */unsigned char  d_type;      /* type of file; not supportedby all file system types */char           d_name[256]; /* filename */};

在stat结构体当中有两个字段,一个是st_uid , 一个是st_gid 两个变量都是数值类型,要获得具体的所属用户的名字和所属组的名字,则需要使用getpwuid()和getgrgid()这两个函数。

       getpwnam, getpwnam_r, getpwuid, getpwuid_r - get password file entry#include <sys/types.h>#include <pwd.h>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);

这组函数和getpwuid()所实现的功能都是类似的。

这里面有一个结构体struct passwd:

struct passwd {char   *pw_name;       /* username */char   *pw_passwd;     /* user password */uid_t   pw_uid;        /* user ID */gid_t   pw_gid;        /* group ID */char   *pw_gecos;      /* user information */char   *pw_dir;        /* home directory */char   *pw_shell;      /* shell program */};

这样就可以得到此用户的所有信息。包括用户密码。

还有一个函数和他类似:getgrgid()

NAMEgetgrnam, getgrnam_r, getgrgid, getgrgid_r - get group file entrySYNOPSIS#include <sys/types.h>#include <grp.h>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

struct group {char   *gr_name;       /* group name */char   *gr_passwd;     /* group password */gid_t   gr_gid;        /* group ID */char  **gr_mem;        /* group members */};

现在我们来实现一个在linux下面常用的一个功能:

即:ls -l -i

大家都知道ls 是显示所有当前目录下的所有文件的信息,包括目录。所以我们要打开的目录就是openddir(".");然后读取其信息,并对其分解。

  1 #include <time.h>2 #include <stdio.h>3 #include <stdlib.h>4 #include <unistd.h>5 #include <sys/types.h>6 #include <sys/stat.h>7 #include <string.h>8 #include <dirent.h>9 #include <pwd.h>10 #include <grp.h>11 12 void get_type( int );13 void get_mode( int );14 15 int main()16 {17     DIR * dir ;18     dir = opendir(".");19     if( dir == NULL )20     {21         perror("opendir");22         exit(1);23     }24     struct dirent *cur ;25     while( ( cur = readdir( dir ) ) != NULL )26     {27         struct stat st ;28         /* get states of file from d_name */29         int ret = stat( cur->d_name , &st );30         if( ret == -1 )31         {32             perror("stat");33             exit(1);34         }35         printf("%ld " , st.st_ino );36         get_type( st.st_mode );37         get_mode( st.st_mode );38         /* getpwuid getgrgid*/39         /* get namenam and group name through the st_uid and st_gid  */40         struct passwd * pwd = getpwuid( st.st_uid );41         printf("%s " , pwd->pw_name );42 //      printf("%s  " , pwd->pw_passwd );43 //      printf("%s  " , pwd->pw_gecos );44         struct group *grp = getgrgid( st.st_gid );45         printf("%s " , grp->gr_name );46         printf("%ld\t" , st.st_size );47         /* ctime */48         char *time = ctime( &st.st_ctime );49         printf("%.12s " , time+4 );50         printf("%s " , cur->d_name );51         printf("\n");52     }53     return 0;54 }55 56 /* get the type of current files */57 void get_type( int m )58 {59     if( S_ISREG(m))60         printf("-");61     else if( S_ISDIR(m))62         printf("d");63     else if( S_ISCHR(m))64         printf("c");65     else if( S_ISBLK(m))66         printf("b");67     else if( S_ISFIFO(m))68         printf("p");69     else if( S_ISLNK(m))70         printf("l");71     else //if( S_ISSOCK(m))72         printf("s");73 }74 75 /* get the modition of current files */76 void get_mode( int m )77 {78     char str[10];79     memset( str , '-' , 10 );       // littal bug80     str[9] = '\0';81     /* onwer user's mode */82     if( ( m&S_IRUSR ) == S_IRUSR )83         str[0] = 'r';84     if( ( m&S_IWUSR ) == S_IWUSR )85         str[1] = 'w';86     if( ( m&S_IXUSR ) == S_IXUSR )87         str[2] = 'x';88     /* group user's mode */89     if( ( m&S_IRGRP) == S_IRGRP )90         str[3] = 'r';91     if( ( m&S_IWGRP) == S_IWGRP )92         str[4] = 'w';93     if( ( m&S_IXGRP) == S_IXGRP )94         str[5] = 'x';95     /* other user's mode */96 97     if( (m&S_IROTH) == S_IROTH )98         str[6] = 'r';99     if( (m&S_IWOTH) == S_IWOTH )
100         str[7] = 'w';
101     if( (m&S_IXOTH) == S_IXOTH )
102         str[8] = 'x';
103     printf("%s  " , str );
104 }
105 

以上代码我在使用memset()的时候第二个参数报错了,后来找了半天的原因,原来是因为使用‘-’这个字符覆盖数组的时候我弄成了“-”这是字符串,对应的ASCII的值是不一样的。这个例子的关键是如何实现权限的打印。通过stat结构体的中的st_mode 并对其判断。

转载于:https://www.cnblogs.com/jamesduan/archive/2013/01/26/2877899.html

相关文章:

LSGO软件技术团队招新

团队招新 LSGO软件技术团队&#xff08;Dreamtech算法组&#xff09;成立于2010年09月&#xff0c;团队主要从事地理信息系统、管理信息系统、计算机视觉等领域的应用开发&#xff0c;团队同时具有培养学生的重要职能&#xff0c;毕业学生分布在IBM、百度、阿里、腾讯、京东、…

java一个月日历

项目需要&#xff0c;获取当天之后的30天&#xff0c;并提示星期几&#xff08;周几&#xff09;&#xff0c;写了一个工具类 /** 计算日期时间author shijing2015年8月10日下午2:16:09param date 传入的需要计算的日期param timeWay 计算方式&#xff08;年、月、周、日&#…

UI培训分享:学UI设计需要知道哪些事情?

很多同学都想要学习UI设计技术&#xff0c;因为UI设计行业的发展前景非常不错&#xff0c;通过成为一名合格的UI设计师能够够更好的进入到互联网行业&#xff0c;那么学UI设计需要知道哪些事情呢?先来看看下面的详细介绍。 UI培训分享&#xff1a;学UI设计需要知道哪些事情? …

Web开发的那点事--数据持久层常用功能

CSDN博客不再经常更新&#xff0c;更多优质文章请来 粉丝联盟网 FansUnion.cn! (FansUnion) 数据持久层--4类功能 1.增加 增加一条记录-实体&#xff08;有关联&#xff0c;没有关联&#xff09; 2.修改 修改一个字段 修改多个字段 修改哪一列或哪些列&#xff1a;wher…

Dotfuscator代码混淆工具的使用

关于Dotfuscator&#xff0c;VS自带了一个社区版的源代码保护工具&#xff0c;不过它只有基本的混淆命名的功能。专业版功能很多&#xff0c;可以混淆流程&#xff0c;密字符串&#xff0c;加入水印&#xff0c;程序签名等。 工具/原料 Dotfuscator Professional Edition 4.9方…

【青少年编程(第24周)】Python-Turtle组队学习结营!

2021年08月01日&#xff08;周日&#xff09;晚20:00我们在青少年编程竞赛交流群开展了第二十四次直播活动。我们直播活动的主要内容如下&#xff1a; 首先&#xff0c;我们奖励了上周测试超过60分的小朋友。 其次&#xff0c;讲解了上次测试中小朋友们做错的题目。 最后&…

参加完Python培训后有哪些就业方向

很多学习Python技术的同学都是为了后面能够找到一个好的工作&#xff0c;对于大家来说了解了Python的就业方向&#xff0c;后面就可以根据自己的能力来选择对应的工作岗位了&#xff0c;那么下面小编就为大家详细的介绍一下参加完Python培训后有哪些就业方向? 参加完Python培训…

June:Datawhale开源学习小程序升级啦!

1. 开源学习小程序的使用 我们通过七个视频来介绍如何使用Datawhale开源学习小程序。 第一个视频&#xff1a;完善个人信息报名 组队学习报名前&#xff0c;请大家完善个人信息的填写&#xff0c;便于结课后证书发放。 切换到组队学习页面&#xff0c;进入当前营期&#xf…

mybatis-错误记录java.lang.ExceptionInInitializerError

今天刚学习mybatis&#xff0c;遇到了一个错误&#xff0c;纠结了半天的时间&#xff0c;所以将发现的问题和解决得方法写一下。 错误信息如下&#xff1a; java.lang.ExceptionInInitializerErrorat com.ibatis.po.TestSysArea.testInsert(TestSysArea.java:31)at sun.reflect…

解决ScrollView嵌套ListView高度的问题

2019独角兽企业重金招聘Python工程师标准>>> public static void setListViewHeight(ListView listView) {ListAdapter listAdapter listView.getAdapter();int totalHeight 0;for (int i 0; i < listAdapter.getCount(); i) {View listItem listAdapter.get…

UI培训教程分享:UI设计如何确定设计风格

在UI设计工作岗位中&#xff0c;进行设计工作的时候&#xff0c;UI设计师门需要对整体的设计要素进行把控&#xff0c;这样才能设计出优秀的设计作品&#xff0c;本期小编为大家介绍的UI培训教程就是关于UI设计如何确定设计风格&#xff0c;希望以下内容能够给大家带来帮助。 U…

32位汇编寄存器及汇编指令

32位CPU所含有的寄存器有&#xff1a; 4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP) 6个段寄存器(ES、CS、SS、DS、FS和GS)1个指令指针寄存器(EIP) 1个标志寄存器(EFlags) 1、数据寄存器数据寄存器主要用来保存操作数和运算结果等…

RPC-client异步收发核心细节?

通过上篇文章的介绍&#xff0c;知道了要实施微服务&#xff0c;首先要搞定RPC框架&#xff0c;RPC框架分为客户端部分与服务端部分。 RPC-client的部分又分为&#xff1a; &#xff08;1&#xff09;序列化反序列化的部分&#xff08;上图中的1、4&#xff09; &#xff08;2&…

【青少年编程】【三级】病毒传染模拟程序

「青少年编程竞赛交流群」已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 微信后台回复“资料下载”可获取以往学习的材料&#xff08;视频、代码、文档&…

UI培训分享:UI设计行业常见术语有哪些?

学会UI设计之后&#xff0c;大家后面就要进入到真正的UI设计行业了&#xff0c;那么关于UI设计行业的常见术语大家也要做一些了解&#xff0c;尤其是新人&#xff0c;这对后面的工作会很多有帮助&#xff0c;本期UI培训教程就给大家介绍一下UI设计行业常见术语有哪些? UI培训分…

面试常用SQL整理

我们都知道面试的时候通常都会考数据库部分的知识&#xff0c;所以在此整理了下我们常用的面试中常用的一些查询语句SQL&#xff0c;本人测试数据库为SQL Server2008 首先在数据库中建立一个测试库&#xff0c;此处用DavidTest代替 数据表与相应测试数据 USE [DavidTest] GO /*…

【青少年编程(第25周)】隔离终于解除了!

2021年08月08日&#xff08;周日&#xff09;晚20:00我们在青少年编程竞赛交流群开展了第二十五次直播活动。我们直播活动的主要内容如下&#xff1a; 首先&#xff0c;我们奖励了上周测试超过60分的小朋友。 其次&#xff0c;我们鼓励刚刚加入学习的小朋友参加8月14日开营的&…

JetBrains大力推广Kotlin为哪般?

在之前一篇备受关注的文章“Kotlin与Java之争”中&#xff0c;Vasiliy Zukanov讲述了发生在Kotlin与Java之间的一场没有硝烟的战争&#xff0c;并认为企业从Java转向Kotlin可能需要付出更大的代价。最近&#xff0c;Vasiliy继续发文&#xff0c;对JetBrains大力推广Kotlin背后的…

哪些人适合参加Python培训班?

哪些人适合参加Python培训班?确实&#xff0c;不是所有人都适合参加Python培训班的&#xff0c;有一定基础的同学会选择自学&#xff0c;零基础的同学比较适合参加Python培训班&#xff0c;来看看下面的具体介绍。 哪些人适合参加Python培训班? 1、学生/零基础学员:如果你自制…

关于jsp页面中的pageEncoding和contentType以及html中的meta标签中字符集的设置(转)...

转载&#xff1a;《关于JSP页面中的pageEncoding和contentType两种属性的区别》 pageEncoding是jsp文件本身的编码 contentType的charset是指服务器发送给客户端时的内容编码 JSP要经过两次的“编码”&#xff0c;第一阶段会用pageEncoding&#xff0c;第二阶段会用utf-8至utf-…

JNI调用实例

1. 环境 Windows7-64Bit VS2010-32Bit JDK1.8-64Bit 2. 步骤 2.1 创建NativePrint类 public class NativePrint {public native void nativePrint(); } 其中包含一个native方法&#xff0c;这个native方法是通过C实现的&#xff0c;C的实现代码最终是生成dll文件&#xff0c;然…

【青少年编程】【三级】加法出题机

「青少年编程竞赛交流群」已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 微信后台回复“资料下载”可获取以往学习的材料&#xff08;视频、代码、文档&…

Python培训教程分享:Python异常机制

​ 在学习Python技术的时候&#xff0c;我们经常会遇到一些异常&#xff0c;例如导致程序在运行过程中出现的中断或退出&#xff0c;我们都称之为异常&#xff0c;大多数的异常都不会被程序处理&#xff0c;而是以错误信息的形式展现出来。本期Python培训教程就算教大家关于Pyt…

SharePoint【调试,诊错系列】-- 一种调试Sharepoint2010 Solution的快捷方式

Visual Studio 2010 支持通过F5来调试Sharepoint Solutions&#xff0c;但这种方法却很难用在调试workflows, event recievers, custom controls上&#xff0c;我们往往通过 "Attach to process..."来调试这些模块&#xff0c;关于如何Attach到正确的Process&#xf…

通往SQL Server复制的阶梯:一级- SQL服务器复制介绍

链接&#xff1a;http://www.sqlservercentral.com/articles/StairwaySeries/72274/ 文章&#xff1a;Stairway to SQL Server Replication: Level 1 - Introduction to SQL Server Replication 通往SQL Server复制的阶梯:一级- SQL服务器复制介绍 By Sebastian Meine, 2012/12…

【青少年编程】【三级】青蛙捕虫

「青少年编程竞赛交流群」已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 微信后台回复“资料下载”可获取以往学习的材料&#xff08;视频、代码、文档&…

UI培训教程分享:UI设计的分类有哪些?

本期为大家介绍的UI培训教程是关于UI设计分类这块的&#xff0c;在UI设计中&#xff0c;我们常应用到的终端设备可大致分为三类&#xff0c;分别为移动端UI设计、PC端UI设计、其他终端UI设计。 UI培训教程分享&#xff1a;UI设计的分类有哪些? 1. 移动端UI设计 移动端一般指移…

slider(滑动条)控件模版,样式--用图片定义控件模版

初接触wpf&#xff0c;想自己用图片做一个个性slider滑块控件&#xff0c;网上找了很久无果。后来一些机缘巧合看别人源码的时候找到了类似的&#xff0c;然后自己再查了一下msdn&#xff0c;大概弄懂了。 我们先来看看slider控件组成元素。 Slider控件组成&#xff1a; 用图片…

360浏览器调用selenium

2019独角兽企业重金招聘Python工程师标准>>> 360浏览器调用selenium package com.demo;import java.io.File; import java.io.IOException;import org.junit.Before; import org.junit.Test; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver;…

【组队学习】【28期】R语言数据科学

R语言数据科学 论坛版块&#xff1a; http://datawhale.club/c/team-learning/36-category/36 开源内容&#xff1a; https://github.com/datawhalechina/team-learning-program/tree/master/RLanguage 学习目标 向零基础的同学介绍如何利用R语言进行数据分析。通过学习&…