nuttx/include/sys/msg.h
2022-10-22 12:58:11 +08:00

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 */