OK, wiem, że teoretycznie proces może przesłać innemu procesowi swoje deskryptory.

Ale jeśli proces tego nie zrobi… to czy można założyć, że żaden inny proces nie może "wziąć sobie" któregoś z deskryptorów mojego procesu i np. wywołać na nim close() uniemożliwiając mi pisanie do pliku?

Czemu o to pytam: Taka funkcja recv() na przykład może się wywalić z m.in. nast. błędami: EBADF, jeśli the argument sockfd is an invalid descriptor; ENOTCONN, jeśli the socket is associated with a connection-oriented protocol and has not been connected; ENOTSOCK, jeśli the file descriptor sockfd does not refer to a socket. Moją pierwszą intuicją jest napisanie czegoś takiego:

ssize_t bytes_received = recv(…);
if(bytes_received == -1) {
    assert(errno != EBADF);
    assert(errno != ENOTCONN);
    assert(errno != ENOTSOCK);
}

Chciałoby się założyć, że jeśli recv() wywali się z którymkolwiek z tych błędów, to znaczy, że gdzieś jest bug w programie, bo przy dobrze napisanym programie takie błędy nie mają prawa się zdarzyć (podobnie jak na jawny bug wskazuje EFAULT, który jest rzucany, jeśli the receive buffer pointer(s) point outside the process's address space). To, co piszę, byłoby prawdą, jeśliby inne procesy nie mogły gmerać w moich deskryptorach plików. Bo jeśliby mogły, to pojawienie się EBADF na przykład mogłoby świadczyć nie o tym, że jest bug w moim programie (tj. np. zapomniałem wywołać socket() lub nie sprawdziłem, czy socket() nie zwróciło -1), ale o tym, że ktoś sobie wywołał close() na moim deskryptorze?