What about the other versions?
All the message-passing functions except the MsgSend*() family have the same general form: if the function has a v at the end of it, it takes an IOV and a number-of-parts; otherwise, it takes a pointer and a length.
The MsgSend*() family has four major variations in terms of the source and destinations for the message buffers, combined with two variations of the kernel call itself.
Look at the following table:
Function | Send buffer | Receive buffer |
---|---|---|
MsgSend() | Linear | Linear |
MsgSendnc() | Linear | Linear |
MsgSendsv() | Linear | IOV |
MsgSendsvnc() | Linear | IOV |
MsgSendvs() | IOV | Linear |
MsgSendvsnc() | IOV | Linear |
MsgSendv() | IOV | IOV |
MsgSendvnc() | IOV | IOV |
By linear,
I mean a single buffer of type void *
is passed, along with its length.
The easy way to remember this is that the v
stands for
vector,
and is in the same place as the appropriate
parameter—first or second, referring to send
or receive,
respectively.
Hmmm... looks like the
MsgSendsv()
and
MsgSendsvnc()
functions are identical, doesn't it?
Well, yes, as far as their parameters go, they indeed are.
The difference lies in whether or not they are cancellation points.
The nc
versions are not cancellation points, whereas
the non-nc
versions are.
(For more information about cancellation points and cancelability in general,
please consult the QNX OS C Library Reference, under
pthread_cancel().)