Вы не отправляете адрес фд. Вы отправляете массив (с 1 элементом в данном случае). Так как отправляется только один fd, используется адрес самого дескриптора файла, так как на самом деле нет разницы между выполнением этого и выполнением:
int fds[1];
fds[1] = ch->fd;
msg.msg_accrights = (caddr_t) fds;
msg.msg_accrightslen = sizeof fds;
sendmsg отправит значение этого массива, поэтому другой конец получит значение дескриптора файла, а не адрес дескриптора файла.