Dauerhaft verstopfte Message Queue



  • 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 googlen

    IPC_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#L175

    Nein, 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.html

    lg lolo


Anmelden zum Antworten