Ну, по крайней мере, в теории, вы все равно делаете чтение для сокета, и для устройства, и для канала, и ....: -P
Если вам нужно больше данных из сокета, таких как адреса сокетов, вы можете просто вызвать функции для этого. Он просто потерпит неудачу для не-сокетов, и вам решать, как вы хотите с этим справиться.
Если вы действительно должны знать, введите fstat
в вашем файловом дескрипторе, а затем посмотрите на его режим (st_mode
):
mode_t type;
struct stat fdstat;
/* ... */
if (fstat(fd, &fdstat) == -1)
/* error out */
type = fdstat.st_mode & S_IFMT;
switch (type) {
case S_IFSOCK:
/* socket */
case S_IFIFO:
/* FIFO */
/* other cases */
}