Linux程序设计-生成一个大小为2M的文件并且显示其权限

  • Post author:
  • Post category:linux


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 版权协议,转载请附上原文出处链接和本声明。