Socket file descriptor - pitanje

Nakon što otvorim novi socket, kad pročitam vrijednost socket descriptora sa printf("%d\n",socket) dobijem broj 3, umjesto standardnih 0,1 ili 2. Povratna vrijednost je integer pa mogu pročitati sa printf(…).
Šta znači broj 3 ? Zna li ko uspavani forume ?
I još jedno pitanjce - kakva je struktura u stvari socket - je li to file, struct ili nešto treće ? Vidim da je locirana duboko u sistemu, i da se ne koriste pointeri već descriptori.

Imas onaj socket family pa moze biti AF_INET 2 i imas tip SOCK_STREAM koji ima vrijednost 1 i to su mu vjerojatno flagovi sa kojima se socket kreirao, pa kad kombinujes sa or operatorom AF_INET | SOCK_STREAM dobijes 3 vrijednost, sto je ustvari int 3. Barem pretpostavljam. Definirano u socket.h, mozes pogledati tamo.

https://en.wikipedia.org/wiki/File_descriptor

Po defaultu su za svaki program na Unixu otvorene tri datoteke (STDIN, STDOUT i STDERR), gdje se otvorenim datotekama dodjeljuje ID integer tipa. Brojanje počinje od 0, tako da imamo 0, 1, 2. Svaka sljedeća otvorena datoteka dobija sljedeći jedinstveni broj (u tvom slučaju 3). Otvori više socketa ili datoteka i isprintaj njihove file deskriptore pa ćeš vidjeti…

P.S. moguće je imati programe koji nemaju otvorene ove 3 datoteke, tako se u stvari prave daemoni: http://www.danielhall.me/2010/01/writing-a-daemon-in-c/

Hm, jasno mi je sada.
U suštini manipulacija (open,read,write) sa file deskriptorima je low-level karaktera , i za postoje posebne biblioteke. Socket je implementiran na takav način.