214 lines
8.1 KiB
C
214 lines
8.1 KiB
C
|
/****************************************************************************
|
||
|
* include/sys/msg.h
|
||
|
*
|
||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||
|
* contributor license agreements. See the NOTICE file distributed with
|
||
|
* this work for additional information regarding copyright ownership. The
|
||
|
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||
|
* "License"); you may not use this file except in compliance with the
|
||
|
* License. You may obtain a copy of the License at
|
||
|
*
|
||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||
|
*
|
||
|
* Unless required by applicable law or agreed to in writing, software
|
||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||
|
* License for the specific language governing permissions and limitations
|
||
|
* under the License.
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
|
||
|
#ifndef __INCLUDE_SYS_MSG_H
|
||
|
#define __INCLUDE_SYS_MSG_H
|
||
|
|
||
|
/****************************************************************************
|
||
|
* Included Files
|
||
|
****************************************************************************/
|
||
|
|
||
|
#include <nuttx/config.h>
|
||
|
#include <sys/ipc.h>
|
||
|
#include <time.h>
|
||
|
|
||
|
/****************************************************************************
|
||
|
* Pre-processor Definitions
|
||
|
****************************************************************************/
|
||
|
|
||
|
/* The MSG_NOERROR identifier value, the msqid_ds struct and the msg struct
|
||
|
* are as defined by the SV API Intel 386 Processor Supplement.
|
||
|
*/
|
||
|
|
||
|
#define MSG_NOERROR 010000 /* No error if message is too big */
|
||
|
#define MSG_EXCEPT 020000 /* Recv any msg except of specified type.*/
|
||
|
#define MSG_COPY 040000 /* Copy (not remove) all queue messages */
|
||
|
|
||
|
/****************************************************************************
|
||
|
* Public Type Declarations
|
||
|
****************************************************************************/
|
||
|
|
||
|
typedef unsigned long msgqnum_t;
|
||
|
typedef unsigned long msglen_t;
|
||
|
|
||
|
struct msqid_ds
|
||
|
{
|
||
|
struct ipc_perm msg_perm; /* Ownership and permissions */
|
||
|
time_t msg_stime; /* Time of last msgsnd(2) */
|
||
|
time_t msg_rtime; /* Time of last msgrcv(2) */
|
||
|
time_t msg_ctime; /* Time of last change */
|
||
|
unsigned long msg_cbytes; /* Current number of bytes in
|
||
|
* queue (nonstandard) */
|
||
|
msgqnum_t msg_qnum; /* Current number of messages
|
||
|
* in queue */
|
||
|
msglen_t msg_qbytes; /* Maximum number of bytes
|
||
|
* allowed in queue */
|
||
|
pid_t msg_lspid; /* PID of last msgsnd(2) */
|
||
|
pid_t msg_lrpid; /* PID of last msgrcv(2) */
|
||
|
};
|
||
|
|
||
|
/* Structure describing a message. The SVID doesn't suggest any
|
||
|
* particular name for this structure. There is a reference in the
|
||
|
* msgop man page that reads "The structure mymsg is an example of what
|
||
|
* this user defined buffer might look like, and includes the following
|
||
|
* members:". This sentence is followed by two lines equivalent
|
||
|
* to the mtype and mtext field declarations below. It isn't clear
|
||
|
* if "mymsg" refers to the name of the structure type or the name of an
|
||
|
* instance of the structure...
|
||
|
*/
|
||
|
|
||
|
struct mymsg
|
||
|
{
|
||
|
long mtype; /* message type (+ve integer) */
|
||
|
char mtext[1]; /* message body */
|
||
|
};
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
#define EXTERN extern "C"
|
||
|
extern "C"
|
||
|
{
|
||
|
#else
|
||
|
#define EXTERN extern
|
||
|
#endif
|
||
|
|
||
|
/****************************************************************************
|
||
|
* Public Function Prototypes
|
||
|
****************************************************************************/
|
||
|
|
||
|
/****************************************************************************
|
||
|
* Name: msgctl
|
||
|
*
|
||
|
* Description:
|
||
|
* System V message control operations.
|
||
|
* msgctl() performs the control operation specified by cmd on the
|
||
|
* System V message queue with identifier msqid.
|
||
|
*
|
||
|
* Input Parameters:
|
||
|
* msqid - System V message queue identifier
|
||
|
* cmd - Command operations
|
||
|
* msqid_ds - Defines a message queue
|
||
|
*
|
||
|
* Returned Value:
|
||
|
* On success, IPC_STAT, IPC_SET, and IPC_RMID return 0. A
|
||
|
* successful IPC_INFO or MSG_INFO operation returns the index of
|
||
|
* the highest used entry in the kernel's internal array recording
|
||
|
* information about all message queues. (This information can be
|
||
|
* used with repeated MSG_STAT or MSG_STAT_ANY operations to obtain
|
||
|
* information about all queues on the system.) A successful
|
||
|
* MSG_STAT or MSG_STAT_ANY operation returns the identifier of the
|
||
|
* queue whose index was given in msqid.
|
||
|
*
|
||
|
* On failure, -1 is returned and errno is set to indicate the error.
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
|
||
|
int msgctl(int msqid, int cmd, FAR struct msqid_ds *buf);
|
||
|
|
||
|
/****************************************************************************
|
||
|
* Name: msgget
|
||
|
*
|
||
|
* Description:
|
||
|
* Get a System V message queue identifier
|
||
|
* The msgget() system call returns the System V message queue
|
||
|
* identifier associated with the value of the key argument. It may
|
||
|
* be used either to obtain the identifier of a previously created
|
||
|
* message queue (when msgflg is zero and key does not have the
|
||
|
* value IPC_PRIVATE), or to create a new set.
|
||
|
*
|
||
|
* Input Parameters:
|
||
|
* key - Key associated with the message queue
|
||
|
* msgflg - Operations and permissions flag
|
||
|
*
|
||
|
* Returned Value:
|
||
|
* On success, msgget() returns the message queue identifier (a
|
||
|
* nonnegative integer). On failure, -1 is returned, and errno is
|
||
|
* set to indicate the error.
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
|
||
|
int msgget(key_t key, int msgflg);
|
||
|
|
||
|
/****************************************************************************
|
||
|
* Name: msgsnd
|
||
|
*
|
||
|
* Description:
|
||
|
* The msgsnd() function is used to send a message to the queue
|
||
|
* associated with the message queue identifier specified by msqid.
|
||
|
* The msgp argument points to a user-defined buffer that must contain
|
||
|
* first a field of type long int that will specify the type of the
|
||
|
* message, and then a data portion that will hold the data bytes of
|
||
|
* the message.
|
||
|
*
|
||
|
* Input Parameters:
|
||
|
* msqid - Message queue identifier
|
||
|
* msgp - Pointer to a buffer with the message to be sent
|
||
|
* msgsz - Length of the data part of the message to be sent
|
||
|
* msgflg - Operations flags
|
||
|
*
|
||
|
* Returned Value:
|
||
|
* On success, mq_send() returns 0 (OK); on error, -1 (ERROR)
|
||
|
* is returned, with errno set to indicate the error:
|
||
|
*
|
||
|
* EAGAIN The queue was full and the O_NONBLOCK flag was set for the
|
||
|
* message queue description referred to by mqdes.
|
||
|
* EINVAL Either msg or mqdes is NULL or the value of prio is invalid.
|
||
|
* EPERM Message queue opened not opened for writing.
|
||
|
* EMSGSIZE 'msglen' was greater than the maxmsgsize attribute of the
|
||
|
* message queue.
|
||
|
* EINTR The call was interrupted by a signal handler.
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
|
||
|
int msgsnd(int msqid, FAR const void *msgp, size_t msgsz, int msgflg);
|
||
|
|
||
|
/****************************************************************************
|
||
|
* Name: msgrcv
|
||
|
*
|
||
|
* Description:
|
||
|
* The msgrcv() function reads a message from the message queue specified
|
||
|
* by the msqid parameter and places it in the user-defined buffer
|
||
|
* pointed to by the *msgp parameter.
|
||
|
*
|
||
|
* Input Parameters:
|
||
|
* msqid - Message queue identifier
|
||
|
* msgp - Pointer to a buffer in which the received message will be
|
||
|
* stored
|
||
|
* msgsz - Length of the data part of the buffer
|
||
|
* msgtyp - Type of message to be received.
|
||
|
* msgflg - Operations flags.
|
||
|
*
|
||
|
* Returned Value:
|
||
|
* On success, msgrcv() returns the number of bytes actually copied
|
||
|
* into the mtext array.
|
||
|
* On failure, both functions return -1, and set errno to indicate
|
||
|
* the error.
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
|
||
|
ssize_t msgrcv(int msqid, FAR void *msgp,
|
||
|
size_t msgsz, long msgtyp, int msgflg);
|
||
|
|
||
|
#undef EXTERN
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#endif /* __INCLUDE_SYS_MSG_H */
|