Frage

ich zwei Slackware Linux-Systemen haben, auf dem die POSIX Semaphore sem_open() Anruf mit errno bis 38. Beispielcode eingestellt ausfällt unten zu reproduzieren (der Code funktioniert auf CentOS / RedHat).

Gibt es irgendwelche Kernel oder Systemkonfigurationsoptionen, die dies verursachen könnte? Andere Vorschläge?

Systeme mit der Ausgabe sind Slackware 10.1.0 Kernel 2.6.11 /lib/librt-2.3.4.so /lib/libpthread-0.10.so, aber der gleiche Code funktioniert auf dem viel älteren 9 RedHat Kernel 2.4.20 / lib / librt-2.3.2.so /lib/tls/libpthread-0.29.so. (Und funktioniert auch auf CentOS 5 Kernel 2.6.18 /lib/librt-2.5.so /lib/i686/nosegneg/libpthread-2.5.so).

man sem_open legt dies nahe, errno bedeutet sem_open() vom System nicht unterstützt wird.

#define ENOSYS          38      /* Function not implemented */

Die sem_open() User-Space ist in librt die wir dynamisch verknüpfen gegen und librt ist auf den betroffenen Systemen.

Das betroffene System behauptet POSIX Semaphore zu unterstützen: _POSIX_SEMAPHORES wahr und sysconf(_SC_SEMAPHORES) bestätigt dies

.

Danke, Kieran

Bearbeiten. 1: Ich habe weitere Einzelheiten über die Software-Versionen im Einsatz hinzugefügt und einige irrelevanten Kommentare entfernt

Edit 2: / dev / shm ist auf die guten Systeme montiert und nicht auf die schlechten Systeme montiert. Montage es nicht um das Verhalten auf den betroffenen Systemen ändern. Ich denke, / dev / shm notwendig ist, auch, aber sem_open () vor, dass in Ermangelung und Strace unterstützt dies.

# /* Quick'n'dirty test program to illustrate sem_open failure
#Run this file to auto-build test and run as a.out

# Build
gcc $0 -lrt
if [ $? -ne 0 ] ; then exit ; fi

# Run
$( dirname $0)/a.out
exit
*/

#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <semaphore.h>


int main(int argc, char *argv[]) {

 const char *SEM_NAME = "SHRMEM_SCXL";  /* name of mutex */
 sem_t *mutex = SEM_FAILED;             /* ptr to mutex */

#ifdef _POSIX_SEMAPHORES
  printf("_POSIX_SEMAPHORES %ld\n", _POSIX_SEMAPHORES);
#else
  puts("Undefined");
#endif

 printf("sysconf %s\n", sysconf(_SC_SEMAPHORES) ? "Yes" : "No" );

 mutex = sem_open(SEM_NAME, O_CREAT, 0666, 1);

 if (mutex == SEM_FAILED) printf("Failed %d\n", errno);
 else {
        puts("Success - pause while you check /dev/shm ");
        sleep(5);
        sem_close(mutex);
        sem_unlink(SEM_NAME);
 }
}
War es hilfreich?

Lösung

/ dev / shm montiert? Ältere Versionen von Slackware kann nicht dieses Dateisystem beim Booten montiert haben. Von / etc / fstab:

tmpfs  /dev/shm  tmpfs  defaults  0   0

Edit: Das ist wahrscheinlich nicht das Problem, nachdem alle. Ich glaube, Sie können nur den Kernel aktualisieren müssen oder vielleicht sogar librt.

Edit2: Ich denke, dass für Slackware 11, die ich denke, die Sie verwenden, müssen Sie einen Kernel neuer als 2.6.13 die NPTL verwenden Threading-Bibliotheken (Bibliotheken in / lib / tls), die für zu sein scheinen erforderlich die sem_open arbeiten.

Edit3: Ich konnte es mit einem Slackware 11 Box arbeiten ich durch eine haben) Montage / dev / shm und b) die Umgebungsvariable LD_ASSUME_KERNEL 2.6.13 Einstellung (jeder Kernel-Version> 2.6.12 funktioniert) . Das scheint zu arbeiten, selbst wenn der Kernel 2.6.11.11, aber auch andere Dinge wie Fäden auch nicht.

Andere Tipps

ältere Versionen der Threading-Bibliotheken nicht unterstützt POSIX Semaphore zwischen Prozessen zu teilen. Von man sem_init

  

Das pshared Argument gibt an, ob die Semaphore die lokal   aktuelle Prozess (pshared ist Null) oder wird zwischen mehreren geteilt werden   Verfahren (pshared nicht Null ist). Linux tut zur Zeit nicht   Support-Prozess-shared Semaphore, so sem_init immer wieder mit   Fehler ENOSYS wenn pshared nicht gleich Null ist.

Als sem_open () Semaphore schafft genannt, ist es immer versucht, sie zwischen den Prozessen zu teilen.

Um anonyme Semaphore zwischen Prozessen mit sem_init zu unterstützen den Austausch () auf Slackware 10

  • Upgrade libpthread und (möglicherweise) librt
  • Upgrade des Kernels

Zusätzlich zur Unterstützung Sharing genannt Semaphore mit sem_open ()

  • eine Zeile in /etc/fstab /dev/shm als tmpfs zu montieren

    tmpfs / dev / shm tmpfs defaults 0 0

  • run mount /dev/shm oder Neustart

Die „Prozess geteilt sema4s funktioniert nicht“ Hypothese macht mir einen Sinn. Nicht, dass es hilft Ihnen, aber wenn Sie Zeit und Lust haben, mögen Sie vielleicht die folgenden, um zu versuchen, um zu sehen, ob der „Prozess-shared“ Aspekt ist das, was versagt:

  1. erstellen Semaphore sem_init in ungeteilten Speicher verwenden (Threads). Wenn es funktioniert, dann sema4s Arbeit im Prozess.

  2. Wiederholungsexperiment im gemeinsam genutzten Speicher. Dies sollte Ihnen sagen, wenn sie zwischen den Prozessen arbeiten. Beachten Sie, dass Sie benötigen, um tatsächlich versuchen, die sema4 zu verwenden, um zu sehen, ob es zwischen den Prozessen arbeitet.

Eine weitere Möglichkeit, eine Semaphore über Prozesse zu teilen ist SystemV Semaphore zu verwenden.

Diese funktionieren auch in der gemeinsam genutzte POSIX Semaphore nicht (zumindest auf den oben beschriebenen Systemen.).

Siehe http: // www.linuxdevcenter.com/pub/a/linux/2007/05/24/semaphores-in-linux.html Beispiele für die zwei Arten von Semaphore verwenden.

Ich arbeite mit Posix-Nachrichtenwarteschlangen habe ich den gleichen Fehler mq_open bekommt mit errono 38 gescheitert war (ENOSYS).

arround Die Arbeit ist die kenel mit POSIX messge QUEUE in der Kernel-Konfiguration aktiviert werden, damit wieder aufzubauen.

Damit wird den Kernel mit POSIX Message Queue Unterstützung bauen und es funktioniert für mich.

Danke

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top