Что такое «тотал» из ls -al? - PullRequest
2 голосов
/ 03 апреля 2019

Мне было поручено имитировать команду ls -alU --time-style=long-iso. В то время как у меня это почти упало, я не совсем понимаю, что это за первое, как общее. Я понимаю, что это общее количество используемых блоков * 2 или что-то подобное, но я не понимаю, откуда берется это число и где его можно найти, используя stat?

КОД

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <grp.h>
#include <time.h>
#include <pwd.h>
#include <errno.h>
#include <string.h>

int main(void)
{
    DIR *mydir;
    struct dirent *myfile;
    struct stat myStat;
    struct passwd *pwd;
    int s;
    struct tm lt;
    char buf[1024];
    struct group *gf;
    mydir = opendir("./");

    while((myfile = readdir(mydir)) != NULL)
    {
        stat(myfile->d_name, &myStat);
        if((stat(myfile->d_name, &myStat) ) == 0){
            pwd = getpwuid(myStat.st_uid);
        }
        gf = getgrgid(myStat.st_gid);
        time_t t = myStat.st_mtime;
        localtime_r(&t, &lt);
        char timebuf[80];
        char timebuf2[80];

        strftime(timebuf, sizeof(timebuf), "%F", &lt);
        strftime(timebuf2, sizeof(timebuf2), "%R", &lt);
        printf( (S_ISDIR(myStat.st_mode)) ? "d" : "-");
        printf( (myStat.st_mode & S_IRUSR) ? "r" : "-");
        printf( (myStat.st_mode & S_IWUSR) ? "w" : "-");
        printf( (myStat.st_mode & S_IXUSR) ? "x" : "-");
        printf( (myStat.st_mode & S_IRGRP) ? "r" : "-");
        printf( (myStat.st_mode & S_IWGRP) ? "w" : "-");
        printf( (myStat.st_mode & S_IXGRP) ? "x" : "-");
        printf( (myStat.st_mode & S_IROTH) ? "r" : "-");
        printf( (myStat.st_mode & S_IWOTH) ? "w" : "-");
        printf( (myStat.st_mode & S_IXOTH) ? "x" : "-");
        printf(" ");
        printf("%ld ", myStat.st_nlink);
        if(pwd != 0){
            printf("%s %s %ld\t%s %s %s\n", pwd->pw_name, gf->gr_name, (long)myStat.st_size, timebuf, timebuf2, myfile->d_name);
        }else  {

            printf("%d %s %ld\t%s %s %s\n", myStat.st_uid, gf->gr_name, (long)myStat.st_size, timebuf, timebuf2, myfile->d_name);
            printf("\n");
        } 
    }
    closedir(mydir);
}

ТЕКУЩИЙ ВЫХОД

drwxr-xr-x 3 user user    46 2019-04-03 21:17 .
drwxr-xr-x 3 user root    19 2019-04-03 18:33 ..
drwxr-xr-x 2 user user     6 2019-04-03 18:34 .che
-rw-r--r-- 1 user user  1895 2019-04-03 21:17 lsdir.c
-rwxr-xr-x 1 user user 13304 2019-04-03 21:17 lsdir

желаемый выход

total 20
drwxr-xr-x 3 user user    46 2019-04-03 21:17 .
drwxr-xr-x 3 user root    19 2019-04-03 18:33 ..
drwxr-xr-x 2 user user     6 2019-04-03 18:34 .che
-rw-r--r-- 1 user user  1895 2019-04-03 21:17 lsdir.c
-rwxr-xr-x 1 user user 13304 2019-04-03 21:17 lsdir
...