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?