Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

msgctl, msgctl64 - Steueroperationen für Nachrichten liefern

&pagelevel(4)&pagelevel

Definition

#include <sys/msg.h>

int msgctl(int msqid, int cmd, struct msqid_ds *buf);

CRTE111A30
int msgctl64(int msqid, int cmd, struct msqid_ds64 *buf); (Ende)

Beschreibung

msgctl() liefert Operationen für die Nachrichtensteuerung, die durch cmd angegeben werden. Die möglichen Werte für cmd und die dazugehörenden Nachrichtensteuerungs-Operationen sind:

IPC_STAT

Die aktuellen Werte aller Elemente der msqid zugeordneten Datenstruktur werden in die Struktur eingetragen, auf die mit buf verwiesen wird. Der Inhalt dieser Struktur wird in sys/msg.h definiert.

IPC_SET

Die Werte folgender Elemente der msqid zugeordneten Datenstruktur des Typs msgqid_ds werden auf die entsprechenden Werte aus der Struktur gesetzt, auf die buf zeigt:

msg_perm.uid
msg_perm.gid
msg_perm.mode
msg_qbytes

IPC_SET kann nur von einem Prozess mit Sonderrechten ausgeführt werden, oder einem Prozess, dessen effektive Benutzernummer gleich dem Wert von msg_perm.cuid oder msg_perm.uid in der msqid_ds-Struktur ist, die msqid zugeordnet ist. Nur ein Prozess mit Sonderrechten kann m msg_qbytes erhöhen.

IPC_RMID

Gelöscht werden die mit msqid angegebene Warteschlangenkennzahl sowie die Warteschlange samt zugeordneter Datenstruktur. IPC_RMID kann nur von einem Prozess ausgeführt werden, der über Sonderrechte verfügt oder dessen effektive Benutzernummer mit msg_perm.cuid bzw. msg_perm.uid in der msquid_ds-Struktur zu msqid übereinstimmt.

Die Funktion msgctl64() verhält sich wie die Funktion msgctl(), außer dass sie die Struktur msgqid_ds64 anstelle der Struktur msgqid_ds verwendet und daher auch über den 19.1.2038 03:14:07 Uhr UTC hinaus korrekt funktioniert.

Zum Inhalt der Struktur, auf die buf zeigt, gehören folgende Elemente:

struct ipc_perm msg_perm; /* operation permission struct */
struct msg     *msg_first;  /* ptr to first message on q */
struct msg     *msg_last;   /* ptr to last message on q */
ulong_t         msg_cbytes;     /* current # bytes on q */
msgqnum_t       msg_qnum;       /* # of messages on q */
msglen_t        msg_qbytes;     /* max # of bytes on q */
pid_t           msg_lspid;      /* pid of last msgsnd */
pid_t           msg_lrpid;      /* pid of last msgrcv */
time_t          msg_stime;      /* last msgsnd time */
time_t          msg_rtime;      /* last msgrcv time */
time_t          msg_ctime;      /* last change time */

Die Elemente der Strukturen msgqid_ds64 sind wie die von msgqid_ds definiert, mit Ausnahme folgender Komponenten:

time64_t    msg_stime;
time64_t    msg_rtime;
time64_t    msg_ctime; 

Returnwert

0

bei Erfolg.


-1

bei Fehler. errno wird gesetzt, um den Fehler anzuzeigen.

Fehler

msgctl() und msgctl64() schlagen fehl, wenn gilt: 

 

EACCES

cmd ist IPC_STAT und der aufrufende Prozess hat kein Leserecht.

 

Erweiterung

 

EFAULT

buf zeigt auf eine unzulässige Adresse. (Ende)

 

EINVAL

msqid ist keine gültige Kennzahl einer Nachrichten-Warteschlange,
oder cmd ist keine gültige Operation,
oder cmd ist IPC_SET und msg_perm.uid oder msg_perm.gid sind ungültig.

 

EPERM

cmd ist IPC_SET und die effektive Benutzernummer des aufrufenden Prozesses ist nicht gleich der eines Prozesses mit Sonderrechten und nicht gleich dem Wert von msg_perm.cuid oder msg_perm.uid in der msqid zugeordneten Datenstruktur.

 

EPERM

cmd ist IPC_SET, ein Versuch wurde gemacht, den Wert von msg_qbytes zu erhöhen, und die effektive Benutzernummer des aufrufenden Prozesses besitzt keine Sonderrechte.


msgctl64() schlägt fehl, wenn gilt:

 

EINVAL

POSIX-BC Korrekturstand < A47.

Hinweis

Das Kommittee des IEEE 1003.4-Standards entwickelt gerade eine alternative Schnittstelle für die Interprozeßkommunikation. Anwendungsprogrammierer, die Interprozeßkommunikation einsetzen, sollten die Anwendungen so konzipieren, daß Module, die derzeit beschriebene Funktionen für Interprozeßkommunikation benutzen, einfach geändert werden können.

Siehe auch

msgget(), msgrcv(), msgsnd(), sys/msg.h, Abschnitt "Interprozesskommunikation“.