I have no experience working with tied objects in XS, but I imagine it would be similar to whatever the perl core does.
First lookup what op does the same thing you want to do. In this case, read (called pp_read in C and located in mathoms.c). It delegates to pp_sysread in pp_sys.c.
The definition of this op is in the section following
PP(pp_sysread)
The section that handles tied handles is:
if ((PL_op->op_type == OP_READ || PL_op->op_type == OP_SYSREAD)
&& gv && (io = GvIO(gv)) )
{
const MAGIC * mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar);
if (mg) {
SV *sv;
PUSHMARK(MARK-1);
*MARK = SvTIED_obj((SV*)io, mg);
ENTER;
call_method("READ", G_SCALAR);
LEAVE;
SPAGAIN;
sv = POPs;
SP = ORIGMARK;
PUSHs(sv);
RETURN;
}
}