1 完成掩码的设置(umask)
2创建一个权限为0666,内容为2M个/0的文件
3.通过调用stat函数实现文件属性的展示,需要在上次的基础上增加权限的展示(-rw-rw-rw-)
其中得到权限的get_perms函数
char *get_perms(struct stat*buf,char *perms){
static char *modes[] = {
"---","--x","-w-","-wx","r--","r-x","rw-","rwx"
};
int i,j;
*perms = '\0';
for(i = 2;i>=0;i--){
j = (buf->st_mode>>(i*3))&07;
strcat (perms,modes[j]);
}
if((buf->st_mode & S_ISUID) != 0)
perms[2] = 's';
if((buf->st_mode & S_ISGID) != 0)
perms[5] = 's';
if((buf->st_mode & S_ISVTX) != 0)
perms[8] = 't';
return perms;
}
/*
* S_IRUSR:用户读权限 S_IWUSR:用户写权限 S_IRGRP:用户组读权限 S_IWGRP:用户组写权限 S_IROTH:其他组都权限 S_IWOTH:其他组写权限
*/
此次程序的头文件
#ifndef CH04_H
#define CH04_H
#include<string.h>
#include<stdio.h>
#include<time.h>
#include<sys/stat.h>
#include<unistd.h>
#include<sys/types.h>
#include<errno.h>
#include<stdlib.h>
void err_exit(char* n)
{
printf("%s",n);
exit(0);
}
#endif
此次程序的主函数
int main(int argc, char **argv)
{
struct stat buf;
if(argc!=2)
{
perror("Usage:my_stat.o + your file name\n");
exit(1);
}
//char filename[10];
char a = '/0';
char str[1024];
int i;
for(i=0;i<1024;i++){
str[i] = a;
}
str[i]='\0';
//struct stat buf;
umask(0);//stat.h ---- 0666-----(-rw-rw-rw)
if(creat(argv[1],S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) < 0 )
err_exit("creat error for the file!");
else
printf("the file is create successfully! \n");
FILE *fp = fopen(argv[1],"w+");
for(int j = 0;j<2048;j++){
fputs(str,fp); //read 2M data to file
}
/*获取文件属性*/
if( stat(argv[1], &buf) == -1 )
{
perror("stat error:");
exit(1);
}else{
printf("文件属性读取成功!\n");
}
char s[12] = {0};
get_perms(&buf,s);
printf("大小: %-8d",buf.st_size);//文件大小,以字节计算
printf("块: %-8d",buf.st_blocks);//占有文件区块个数,一般一个区块大小通常512字节
printf("IO块: %-8d\n",buf.st_blksize);//文件系统IO缓冲区大小
printf("Inode: %-8d",buf.st_ino);//文件i节点标号
printf("硬链接数: %-8d\n",buf.st_nlink);//硬链接数目
printf("the file mode is: %s \n",s);
//printf("device is: %d\n",buf.st_dev);//文件设备编号
fclose(fp);
return 0;
}
最终结果如下:
版权声明:本文为qq_53030983原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。