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