Send a pulse to a process
#include <sys/neutrino.h> int MsgSendPulse ( int coid, int priority, int code, int value ); int MsgSendPulse_r ( int coid, int priority, int code, int value );
Although code can be any 8-bit signed value, you should avoid code values less than zero, in order to avoid conflict with kernel- or QNX manager-generated pulse codes. These codes all start with _PULSE_CODE_ and are defined in <sys/neutrino.h>; for more information, see the documentation for the _pulse structure. A safe range of pulse values is _PULSE_CODE_MINAVAIL through _PULSE_CODE_MAXAVAIL.
libc
Use the -l c option to qcc to link against this library. This library is usually included automatically.
The MsgSendPulse() and MsgSendPulse_r() kernel calls send a short, nonblocking message to a process's channel identified by coid.
These functions are identical except in the way they indicate errors. See the Returns section for details.
You can send a pulse to a process if the sending process's real or effective user ID either:
Or:
This permission checking is identical to that used by kill().
You can use MsgSendPulse() for many purposes; however, due to the small payload of data, you shouldn't use it for transmitting large amounts of bulk data by sending a great number of pulses.
Pulses are queued for the receiving process in the system, using a dynamic pool of memory objects. If pulses are generated faster than they can be consumed by the receiver, then over a period of time the system queue for the pulses could reach a low memory condition. If there's no memory available for the pulse to be queued in the system, the kernel fails the pulse request with an error of EAGAIN. If the priority, code and value don't change, the kernel compresses the pulses by storing an 8-bit count with an already queued pulse.
The receiving thread's effective priority might change when you send a pulse to it. For more information, see “Priority inheritance and messages” in the Interprocess Communication (IPC) chapter of the System Architecture guide. |
When you receive a pulse via the MsgReceive*() kernel call, the rcvid returned is zero. This indicates to the receiver that it's a pulse and, unlike a message, shouldn't be replied to using MsgReply*().
In a client/server design, MsgDeliverEvent() is typically used in the server, and MsgSendPulse() in the client. |
None. In the network case, lower priority threads may run.
You can use MsgSendPulse() to send pulses across the network.
The only difference between the MsgSendPulse() and MsgSendPulse_r() functions is the way they indicate errors:
Safety: | |
---|---|
Cancellation point | No |
Interrupt handler | No |
Signal handler | Yes |
Thread | Yes |
If the server faults on delivery, the pulse is either lost or an error is returned.
MsgDeliverEvent(), MsgReceive(), MsgReceivePulse(), MsgReceivePulsev(), MsgReceivev(), MsgReply(), MsgReplyv(), MsgSend(), MsgSendnc(), MsgSendsv(), MsgSendsvnc(), MsgSendv(), MsgSendvnc(), MsgSendvs(), MsgSendvsnc(), name_open(), _pulse, sched_get_priority_min(), sched_get_priority_max()