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 Neutrino C Library Reference, under pthread_cancel().)