Error-Implementierung von posix message queue - Funktion "nicht implementiert"
Schreibe ich diesen code, um ein posix message queue. Aber ich erhalte eine Fehlermeldung "Funktion nicht implementiert".
Q1. Ist es ein Plattform-bezogene Frage ? [Bin mit Ubuntu 10.10] ich habe irgendwo gelesen, dass ich wiederherstellen müssen, dass mein kernel zu aktivieren, message queues !?
Q2. Ich lese auch etwas über den Start der mqueue-server, bevor Sie tatsächlich mit message-queues ?
Kann mir bitte jemand erklären..
#include <mqueue.h> /* message queue stuff */
#include <iostream>
#include <unistd.h> /* for getopt() */
#include <errno.h> /* errno and perror */
#include <fcntl.h> /* O_flags */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
int main(int argc, char **argv)
{
mqd_t msgQueueDescriptor;
mq_attr attr;
char Msg[]="msg";
attr.mq_maxmsg = 10;
attr.mq_msgsize = sizeof(Msg);
attr.mq_flags = 0;
msgQueueDescriptor = mq_open("/myQueue", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH , attr );
cout << msgQueueDescriptor << " " << errno << " " << strerror(errno);
mq_close(msgQueueDescriptor);
return 0;
}
- Nach
mq_overview(7)
POSIX-Nachrichten-Warteschlangen standardmäßig aktiviert sind, wenn der Bau den kernel, sondern das Ubuntu-Paketbetreuer haben könnten Sie ausgeschaltet ist. - Wie kann ich bestätigen, dass? Wird, dass ein Teil der release-notes von Ubuntu? Und wie kann ich es wieder einschalten falls Ihr wirklich ausgeschaltet?
- Fände ich ubuntu wirklich seltsam, wenn Sie wirklich Sie ausgeschaltet ist. Auf fedora 15, dein Beispiel kompiliert und links erfolgreich.
- Könnten Sie herunterladen möchten einen kernel-source-Paket über Synaptic und prüfen Sie die Konfiguration; der Fehler, den Sie haben ist sicherlich
ENOSYS
- also kein system nennen. Drehen MQs auf würde dann den kernel, denke ich. Ich wäre sehr überrascht, wenn MQs sind nicht im Standard-kernel unterstützt, obwohl. - Dies kompiliert, links und läuft auf Ubuntu 10.04.3. Überprüfen Sie Ihren kernel konfiguriert ist, die mit dem nötigen Flagge. Blick auf
/boot/config*
. CONFIG_POSIX_MQUEUE=y
CONFIG_POSIX_MQUEUE_SYSCTL=y
ist das, was ich sehen kann, in dieser Datei im Zusammenhang mit mqueues. Aber es scheint, dass Sie aktiviert sind?- Ich bin mir sicher, dass du eben einen Fehler in deinem code, die in Ihrer Frage, aber in dem Aufruf
mq_open
sollten Sie die Attribut-argument als ein Zeiger (d.h.&attr
im code-snippet). - na ja, bei einigen Distributionen nur komische Dinge wie, dass.
- Guter Punkt. Der compiler wird nicht fangen, weil die Funktion Prototyp mit
...
an Stelle des vierten Parameters. - Danke für den Hinweis, obwohl ich hatte das gleiche problem, wenn ich
NULL
.
InformationsquelleAutor Amit Tomar | 2012-01-16
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube, ich habe verstanden, was das problem war, oder eher ein Fehler von der Seite.
Diese ist was ich gelesen habe von hier -
So, ich sollte die überprüfung der Wert errno nur, wenn ein Fehler tatsächlich Auftritt!. Aber im obigen code bin ich nur zu drucken ist der Wert unabhängig von der ein Fehler aufgetreten ist oder nicht, und damit er den Druck, die Fehlermeldung entspricht rund Müll gespeicherte Wert in errno.
Also mein code sollte so etwas wie dieses -
Habe ich gerade gemacht ein Narr outa mich :p
PS: so weit Wie message queues, die aktiviert wird, auf Ubuntu 10.10 betrifft, habe ich überprüft die flags, wie erwähnt, durch "n".m.", Sie sind sehr viel aktiviert, und ich bin in der Lage, Nutzung der message queues jetzt. Dank Euch allen - larsmans, VJovic, n.m., Joachim Pileborg, jørgensen.
Über meine zweite Frage
Ich denke, das ist eine Anforderung, die speziell auf QNX.
errno
auf null (zumindest nicht in der standard-C-Bibliothek), und, dass Sie sollte nur geprüfterrno
wenn die Letzte Funktion, die könnte es tatsächlich angedeutet, dass es fehlgeschlagen ist. Gegenbeispiel: auf Solaris, viele der stdio Anrufe überprüfen Sie, ob der output ist ein tty, und lassen Sieerrno == ENOTTY
wenn es nicht, auch wenn der Aufruf erfolgreich war perfekt. Also, ja, Sie machte einen kleinen Narren aus sich selbst, aber Sie lernte von ihm, so ist es eine wertvolle Erfahrung.mqueue server
(und ich habe nie gesehen, jede Erwähnung des es), dann gibt es keine Notwendigkeit, dies zu tun - unabhängig davon, was QNX denkt über die situation.errno
sollte nur durchgeführt werden, wenn eine Funktion fehlschlägt (sofern nicht anders angegeben). Tatsächlich, Lesen Sie die offizielle POSIX-Spezifikation auferrno
hier, sagt Keine Funktion in diesem Band der IEEE Std 1003.1-2001 setzt errno auf 0. Das setzen von errno nach erfolgreichem Aufruf einer Funktion nicht angegeben ist, es sei denn, die Beschreibung diese Funktion gibt an, dass errno wird nicht verändert.