![]() |
![]() |
![]() |
Send a message to a channel
#include <sys/neutrino.h> int MsgSendv( int coid, const iov_t* siov, int sparts, const iov_t* riov, int rparts ); int MsgSendv_r( int coid, const iov_t* siov, int sparts, const iov_t* riov, int rparts );
libc
The MsgSendv() and MsgSendv_r() functions are identical except in the way they indicate errors. See the Returns section for details.
These kernel calls send a message to a process's channel identified by coid. The connection coid is established by calling ConnectAttach(). The send data is taken from the array of buffers pointed to by siov. The reply is placed in the array of buffers pointed to by riov. The number of elements in the send array is given by sparts, while the number of elements in the reply array is given by rparts.
The number of bytes transferred is the minimum of that specified by both the sender and the receiver. The send data isn't allowed to overflow the receive buffer area provided by the receiver. The reply data isn't allowed to overflow the reply buffer area provided.
The sending thread becomes blocked waiting for a reply. If the receiving process has a thread which is RECEIVE-blocked on the channel, the transfer of data into its address space occurs immediately and the receiving thread is unblocked and made ready to run. The sending thread becomes REPLY-blocked. If there's no waiting threads on the channel, the sending thread becomes SEND-blocked and placed in a queue (perhaps with other threads). In this case the actual transfer of data doesn't occur until a receiving thread receives on the channel. At this point, the sending thread becomes REPLY-blocked.
It's quite common to send two-part messages consisting of a fixed header and a buffer of data. The MsgSendv() function gathers the data from the send list into a logically contiguous message and transfers it to the receiver. The receiver doesn't need to specify the same number or size of buffers. The data is laid down filling each entry as required. The same applies to the replied data.
MsgSendv() is a cancellation point for the ThreadCancel() kernel call; MsgSendvnc() isn't.
The only difference between the MsgSendv() and MsgSendv_r() functions is the way they indicate errors:
Safety: | |
---|---|
Cancellation point | Yes |
Interrupt handler | No |
Signal handler | Yes |
Thread | Yes |
ConnectAttach(),
MsgReceive(),
MsgReceivev(),
TimerTimeout(),
and all of the MsgSend*() functions
![]() |
![]() |
![]() |