文件和目录一

stat函数

int stat(const char *restrict *pathname,struct stat * restrict buf)
int fstat(int fd,struct stat *buf)
int lstat(const char *restrict *pathname,struct stat * restrict buf)

这几个函数用来获取文件后者目录的基本信息,第一个函数有两个参数,第一个表示文件或目录的名字,第二个为stat类型的指针。第二个函数第一个参数为文件描述符,第二个参数为stat类型的指针。第三个函数的参数和第一个一样,但是和第一个函数的功能不同,当文件或目录是一个链接文件时第一个函数得到信息是被链接的文件,第三个是这个链接的文件的信息。

stat类型的介绍

struct stat{
mode_t st_mode;
ino_t st_ino;
uid_t st_uid;
gid_t st_gid;
off_t st_size;
.
.
.

}

可以看到这个结构包含很多文件的信息,有文件的用户id和组id,st_mode为文件的权限位和文件类型等信息,st_size表示文件的大小。
下面是几个操作st_mode的几个函数

S_ISREG()
S_ISDIR()
S_ISCHR()
S_ISBLK()
S_ISLNK()
S_ISFIFO()
S_ISSOCK()

这几个函数用来判断文件的类型,使用if(S_ISDIR(buf.st_mode))这样的格式来判断文件的类型。
下面是一个例子

#include"head.h"
int main(int argc,char *argv[])
{
if(argc<2)
{
printf("param number error\n");
return 0;
}
int i;
char *p;
struct stat buf;
for(i=1;i<argc;++i)
{
stat(argv[i],&buf);
if(S_ISREG(buf.st_mode))
p="regular";
else if(S_ISDIR(buf.st_mode))
p="directory";
else if(S_ISCHR(buf.st_mode))
p="charecter special";
else if(S_ISBLK(buf.st_mode))
p="block special";
else if(S_ISLNK(buf.st_mode))
p="link file";
else
p="unkown type";
printf("%s\n",p);
}
return 0;
}

测试:
root@ubuntu:/home/sun/project/dirent# ./stat2 stat1 stat2 / /usr
regular
regular
directory
directory

文件创建屏蔽字

mode_t umask(mode_t cmask)

这个函数的作用是更改文件创建屏蔽字,当我们创建一个文件时,创建文件权限的结果可能和我们编写的不一样,这是因为文件创建屏蔽字的存在,文件创建屏蔽字的作用便是将某个权限设置的不起作用。
下面我们使用一个例子来进行说明。

  • 首先我先观察我们的文件创建屏蔽字
root@ubuntu:/home/sun/project/dirent# umask
0022
  • 可以看到我的文件创建屏蔽字是0022,后面两个2表示屏蔽组和其他的写权限
  • 我们编写一个程序
#include"head.h"
#define RWXALL (S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IWGRP|S_IXGRP|S_IROTH|S_IWOTH|S_IXOTH)
int main()
{
creat("bb1.txt",RWXALL);
mode_t old=umask(0);
creat("bb2.txt",RWXALL);
umask(old);
return 0;
}
结果:
-rwxr-xr-x 1 root root    0 7月  19 17:56 bb1.txt
-rwxrwxrwx 1 root root    0 7月  19 17:56 bb2.txt
  • 可以看到我们创建的一个777的权限,可以看到我们创建的第一个文件的组合其他用户的写权限并没有被设置,这边是文件创建屏蔽字起的作用,屏蔽了组和其他用户的写权限。
  • 我们创建的第二个文件的权限是777这是因为我们使用了umask(0),关闭了文件创建屏蔽字。

更改文件的访问权限

int chmod(const char *pathname,mode_t mode)
int fchmod(int fd,mode_t mode)
成功返回0,失败返回-1

这两个函数的第一个参数表示文件名和文件打开的描述符。
下面是第二个参数mode

S_ISUID  执行时设置用户id
S_ISGID  执行时设置组id
S_IRWXU  用户读写执行
S_IRUSR
S_IWUSR
S_IXUSR
S_IRWXG  组读写执行
S_IRGRP
S_IWGRP
S_IXGRP
S_IRWXO  其他读写执行
S_IROTH
S_IWOTH
S_IXOTH
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容