Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Where to find the complete definition of off_t type?

I am sending file from client to server using TCP. To mark the end of the file I like to send file size before the actual data. So I use stat system call to find the size of the file. This is of type off_t. I like to know how many bytes it occupies so that I can read it properly on the server side. It is defined in the <sys/types.h>. But I do not understand the definition. It just defines __off_t or _off64_t to be off_t. Where to look for __off_t? Also is it convention that __ is prefixed for most of the things in header files and scares me when I read header files to understand better. How to read a header file better?

#ifndef __off_t_defined # ifndef __USE_FILE_OFFSET64 typedef __off_t off_t; # else typedef __off64_t off_t; # endif # define __off_t_defined #endif  
like image 246
FourOfAKind Avatar asked Jan 31 '12 02:01

FourOfAKind


People also ask

Where is Off_t defined?

off_t is normally defined as a signed, 32-bit integer. In the programming environment which enables large files, off_t is defined to be a signed, 64-bit integer. 64-bit file offset, measured in bytes from the beginning of a file or device.

Where is Off_t defined in Linux?

This is a data type defined in the sys/types. h header file (of fundamental type unsigned long) and is used to measure the file offset in bytes from the beginning of the file.

What is the size of Off_t?

int , long , ptr , and off_t are all 32 bits (4 bytes) in size.

What is SYS types H?

The sys/types. h header file defines a collection of typedef symbols and structures.


1 Answers

Since this answer still gets voted up, I want to point out that you should almost never need to look in the header files. If you want to write reliable code, you're much better served by looking in the standard. So, the answer to "where can I find the complete definition of off_t" is "in a standard, rather than a header file". Following the standard means that your code will work today and tomorrow, on any machine.

In this case, off_t isn't defined by the C standard. It's part of the POSIX standard, which you can browse here.

Unfortunately, off_t isn't very rigorously defined. All I could find to define it is on the page on sys/types.h:

blkcnt_t and off_t shall be signed integer types.

This means that you can't be sure how big it is. If you're using GNU C, you can use the instructions in the answer below to ensure that it's 64 bits. Or better, you can convert to a standards defined size before putting it on the wire. This is how projects like Google's Protocol Buffers work (although that is a C++ project).


For completeness here's the answer to "which header file defines off_t?":

On my machine (and most machines using glibc) you'll find the definition in bits/types.h (as a comment says at the top, never directly include this file), but it's obscured a bit in a bunch of macros. An alternative to trying to unravel them is to look at the preprocessor output:

#include <stdio.h> #include <sys/types.h>  int main(void) {   off_t blah;    return 0; } 

And then:

$ gcc -E sizes.c  | grep __off_t typedef long int __off_t; .... 

However, if you want to know the size of something, you can always use the sizeof() operator.

Edit: Just saw the part of your question about the __. This answer has a good discussion. The key point is that names starting with __ are reserved for the implementation (so you shouldn't start your own definitions with __).

like image 99
Timothy Jones Avatar answered Oct 11 '22 23:10

Timothy Jones