Dauerhaft verstopfte Message Queue
-
Hallo,
In einem C Program unter Linux, lege lege per folgendem eine Message Queue an:
msgget( mq_key, IPC_CREAT | 0666 )
Nun wuerde mich interessieren:
- wie bekomme ich die momentante Anzahl der auf der Queue liegenden Messages?
- wie bekomme ich die maximale Anzahl der auf der Queue liegenden Messages?
- wie kann ich zB die Groesse der Queue einstellen, sodass evtl. mehr Messages darin Platz haben?Meine Message struct enthaelt 4 ints und ein 256 elementiges char array, sonst nichts! Alles in Allem kommt es mir so vor, als wenn ich nur vier Messages in die
Queue legen kann, dann verstopft sich msgsnd(). Allerdings kann ich nicht immer gleich alles auf der anderen Seite wieder herausnehmen. Kann das sein, dass der
Platz fuer die Messagequeue so dermassen eingeschraenkt ist??!!!
-
denke hier findest du fast alles was du wissen mußt
http://www.welzl.at/teaching/bs/tutorials/prozesse-syscalls/29.htmspeziell die function
int msgctl(int msgid, int cmd, struct msgid_ds *buf)
sollte für dich interresant sein
das findet man aber schon relativ schnell über google
lg lolo
-
noobLolo schrieb:
das findet man aber schon relativ schnell über google
Stimmt, ueber msgctl und diverse Statusabfrage per msgctl() bin ich auch schon
selber gestossen, bspw. hier:IPC_INFO (Linux specific)
Returns information about system-wide message queue limits and parameters in the structure pointed to by buf....in der Manpage von msgctl(), nur... - wie stelle ich diese "Parameters" denn
anders ein? Das meine Messagequeue dauernd voll zu sein scheint, merke ich ja auch
ohne msgctl.Es waere gut, wenn man - wie bei den Pthreads bspw. - die "Stacksize" oder
entsprechendes auch setzen bzw. veraendern koennte, geht das irgendwie?
-
weiß nicht ob dir das hilft aber das steht hier wie das letzte auch im ersten link
da brauch ich noch nicht mal auf den link clicken...
http://www.google.de/search?hl=de&source=hp&q=linux+set+Message+Queue+size&btnG=Google-Suche&meta=&aq=f&oq=
hab iwi. das gefühl du bist zu faul zum googlenIPC_SET
Write the values of some members of the msqid_ds structure pointed to by buf to the kernel data structure associated with this message queue, updating also its msg_ctime member. The following members of the structure are updated: msg_qbytes, msg_perm.uid, msg_perm.gid, and (the least significant 9 bits of) msg_perm.mode. The effective UID of the calling process must match the owner (msg_perm.uid) or creator (msg_perm.cuid) of the message queue, or the caller must be privileged. Appropriate privilege (Linux: the CAP_IPC_RESOURCE capability) is required to raise the msg_qbytes value beyond the system parameter MSGMNB.http://linux.die.net/man/2/msgctl
lg lolo
-
noobLolo schrieb:
(Linux: the CAP_IPC_RESOURCE capability) is required to raise the msg_qbytes value beyond the system parameter MSGMNB.
Zu faul zum googlen?? Ich??!! Neeeeeein!!! Aber ich versuche das normalerweise eher auf
der Manpage zu lesen (und die ist auch dieselbe wie auf die.net online, etc..). Aber
Du hast Recht - ich hatte den letzten Satz nicht gelesen. Also, koennen wir uns
darauf einigen: "zu faul um das Manual bis zum letzten Satz zu lesen"? Das klingt besser.
Danke, Problem geloest, super!!
-
Hallo, liest das noch wer? Ich habe jetzt noch ein problem mit msgctl()
und zwar versuche ich nun die Groesse fuer die message queue groesser zu setzen, nur geht das eben nur mit root Rechten unter Linux. Afaik gibt es auch eine Moeglichkeit das per echo in /proc auf der Konsole vorher festzulegen, aber ich
wollte fragen ob jemand nicht eine elegantere Methode kennt, wie ich das in meinem C Code einstellen kann?Also in etwa so geht's leider nur als Root:
// ... msgctl( *mq_id, IPC_STAT, &buf ); buf.msg_qbytes = 524288; // ist ca auf 16000, soll aber groesser gemacht werden if( 0 > msgctl( *mq_id, IPC_SET, &buf ) ){ perror( "must be root!" ); }
-
mq_id ist doch vom typ int wieso hast du da nen zeiger verwendet? sollte es per echo auf proc gehen sollte es doch auch mit write() gehen?
lg lolo
-
messagequeuesepp schrieb:
Also in etwa so geht's leider nur als Root:
wär ja noch schöner wenn da jeder hamplemann rum pfuschen könnte
-
also so gings bei mir über die console
noname:/proc# cat /proc/sys/kernel/msgmnb 16384 noname:/proc# echo 13652 > /proc/sys/kernel/msgmnb noname:/proc# cat /proc/sys/kernel/msgmnb 13652 noname:/proc#
also solltest du /proc/sys/kernel/msgmnb öffnen und dann kannst einfach den wert mit nem write als string rein schreiben? hoffe das ist jetzt nicht zu falsch
lg lolo
-
Hallo und danke nochmal nooblobo,
der Code ist aus einem groesseren zusammenhang herauskopiert, daher der Zeiger auf int. Das ganze findet in einer init() Funktion statt, die die mq_id initialisiert wieder zurueck (oben) verfuegbar machen soll, darum. So aus dem Zusammenhang gerissen macht das keinen Sinn, stimmt.Nja, von der Moeglichkeit ueber /proc habe ich wie oben gesagt, auch schon gelesen. Aber ich dachte es muesse auch eine Moeglichkeit geben als "Owner" der Messagequeue deren Parameter zu veraendern, zumindest wird davon in manchen Quellen gesprochen. Naja, vllt gilt das nicht fuer die max Groesse
Danke nochmal fuer die Geduld.
-
PS:
sudo sh -c "echo 524288 > /proc/sys/kernel/msgmnb"
nja, auch nicht viel besser, aber vllt etwas..
-
messagequeuesepp schrieb:
Aber ich dachte es muesse auch eine Moeglichkeit geben als "Owner" der Messagequeue deren Parameter zu veraendern, zumindest wird davon in manchen Quellen gesprochen.
kannst mal eine angeben? damit ich da mal schauen kann wie die das machen
lg lolo
-
The effective UID of the calling process must match the owner (msg_perm.uid) or creator (msg_perm.cuid) of the message queue, or the caller must be privileged. Appropriate privilege (Linux: the CAP_IPC_RESOURCE capability) is required to raise the msg_qbytes value beyond the system parameter MSGMNB.
Quelle: manpage (e.g. hier: http://linux.die.net/man/2/msgctl (wie oben schon zitiert, ist eigentlich die gleiche Stelle)
Also, anscheinend required Linux nur die CAP_IPC_RESOURCE capability, schon kann man die msg_qbytes beyond MSGMNB raisen und dann workts! Aber wie setzt man die CAP_IPC_RESOURCE? (Haette das vllt gleich fragen sollen)
-
Hallo kann es sein, dass man diese "capability" per #define CAP_IPC_RESOURCE im Code bzw. per -D CAP_IPC_RESOURCE als gcc Flag setzt? Zumindest scheint es so zu gehen..
-
puh keine ahnung? könnt auch sein das es distris gibt die etwas lockerer eingestellt sind?
http://linux.die.net/man/7/capabilities
http://www.takatan.net/lxr/source/include/linux/capability.h?v=2.4.21-47.EL#L175
-
noobLolo schrieb:
puh keine ahnung? könnt auch sein das es distris gibt die etwas lockerer eingestellt sind?
http://linux.die.net/man/7/capabilities
http://www.takatan.net/lxr/source/include/linux/capability.h?v=2.4.21-47.EL#L175Nein, da das nicht von der Distri abhaengt sondern vom Linux (Kernel) selber (wie Du mittlerweile sicher auch weitergelesen hast, ich schreibs nur noch der vollstaendigkeit hin). Man kann ueber die Permissionflags u.a. mit Werkzeugen wie lcap diverse Einzelerlaubnisse geben, aber auch nehmen. Im obigen Sinne macht es sinn, die eigene erstellte Messagequeue auch einstellen zu duerfen, daher ist es moeglich sich diese "Capability" zu geben, was afaik per #define moeglich ist (zu sein scheint).
-
bin gerade dabei mich ein bischen einzulesen, dabei ist mir aufgefallen, das sich die manpage auf linux.die.net ein bischen von der auf kernel.org unterscheidet kann mir das zwar nicht erklären, aber ein
ist es mir wert
http://linux.die.net/man/7/capabilities
http://www.kernel.org/doc/man-pages/online/pages/man7/capabilities.7.htmllg lolo