limitless
limitless

Reputation: 669

Is stat's st_blksize measured in bits or bytes?

I'm trying to find the block size on my machine using these lines:

struct stat fi;
stat("/tmp", &fi);
BLOCK_SIZE = fi.st_blksize;

Does BLOCK_SIZE represent the amount of bytes or the amount of bits in a single block?

The documentation says:

" blksize_t st_blksize; /* blocksize for file system I/O */ "

Upvotes: 0

Views: 4196

Answers (3)

Zakir
Zakir

Reputation: 2382

It is in Bytes. Refer the Linux man page example code here:-

printf("Preferred I/O block size: %ld bytes\n", (long) sb.st_blksize);

  The following program calls stat() and displays selected fields in
   the returned stat structure.

   #include <sys/types.h>
   #include <sys/stat.h>
   #include <time.h>
   #include <stdio.h>
   #include <stdlib.h>
   #include <sys/sysmacros.h>

   int
   main(int argc, char *argv[])
   {
       struct stat sb;

       if (argc != 2) {
           fprintf(stderr, "Usage: %s <pathname>\n", argv[0]);
           exit(EXIT_FAILURE);
       }

       if (stat(argv[1], &sb) == -1) {
           perror("stat");
           exit(EXIT_FAILURE);
       }

       printf("ID of containing device:  [%lx,%lx]\n",
            (long) major(sb.st_dev), (long) minor(sb.st_dev));

       printf("File type: ");

       switch (sb.st_mode & S_IFMT) {
       case S_IFBLK:  printf("block device\n");            break;
       case S_IFCHR:  printf("character device\n");        break;
       case S_IFDIR:  printf("directory\n");               break;
       case S_IFIFO:  printf("FIFO/pipe\n");               break;
       case S_IFLNK:  printf("symlink\n");                 break;
       case S_IFREG:  printf("regular file\n");            break;
       case S_IFSOCK: printf("socket\n");                  break;
       default:       printf("unknown?\n");                break;
       }

       printf("I-node number:            %ld\n", (long) sb.st_ino);

       printf("Mode:                     %lo (octal)\n",
               (unsigned long) sb.st_mode);

       printf("Link count:               %ld\n", (long) sb.st_nlink);
       printf("Ownership:                UID=%ld   GID=%ld\n",
               (long) sb.st_uid, (long) sb.st_gid);

       printf("Preferred I/O block size: %ld bytes\n",
               (long) sb.st_blksize);
       printf("File size:                %lld bytes\n",
               (long long) sb.st_size);
       printf("Blocks allocated:         %lld\n",
               (long long) sb.st_blocks);

       printf("Last status change:       %s", ctime(&sb.st_ctime));
       printf("Last file access:         %s", ctime(&sb.st_atime));
       printf("Last file modification:   %s", ctime(&sb.st_mtime));

       exit(EXIT_SUCCESS);
   }

Upvotes: 3

Some programmer dude
Some programmer dude

Reputation: 409136

If you read this POSIX <sys/stat.h> reference you will find

The unit for the st_blocks member of the stat structure is not defined within POSIX.1-2008. In some implementations it is 512 bytes. It may differ on a file system basis. There is no correlation between values of the st_blocks and st_blksize, and the f_bsize (from <sys/statvfs.h> structure members.

So while there's no standardized unit for st_blksize it's unlikely that it's in bits. To get the actual unit you have to research the current operating system, and possibly even the filesystem used.

The Linux stat manual page doesn't mention the unit explicitly, but in the example it says the unit is in bytes.

Upvotes: 7

MrPromethee
MrPromethee

Reputation: 720

Block sizes are usually given in bytes and in the case of stat it is. Giving it in bits would not make much sense.

Upvotes: 0

Related Questions