2016-04-29 2 views
0
mode_t mode = S_IRWXU | S_IRWXG | S_IRWXO; 
shm_fd = shm_open("/ipc_shm", O_CREAT | O_RDWR, mode); 

Dies funktioniert, gibt 4 für shm_fd zurück. Der gleiche Prozess ruft dann eine Bibliotheksfunktion, die auchSekunde shm_open() schlägt fehl mit ENOENT

fd = shm_open("/ipc_shm", O_RDWR, 0); 

ruft Dieses mit errno nicht bis 2, das heißt ENOENT (keine solche Datei oder das Verzeichnis) festgelegt. In der Mitte befindet sich kein Ruf shm_unlink. Irgendeine Idee, warum der zweite Anruf fehlschlägt. Schätze deine Hilfe.

+0

Die einzige Möglichkeit, die ich reproduzieren kann, ist, wenn in der Tat der gemeinsame Speicher auf die eine oder andere Weise nicht verknüpft ist. Wenn es nicht von diesem Programm gemacht wird, wird es von einem anderen Programm gemacht. –

Antwort

1

mein test.c:

#include <sys/mman.h> 
#include <sys/stat.h>  /* For mode constants */ 
#include <fcntl.h>   /* For O_* constants */ 

int main (int argc, char *argv[]) 
{ 
     mode_t mode = S_IRWXU | S_IRWXG | S_IRWXO; 
     int shm_fd = shm_open("/ipc_shm", O_CREAT | O_RDWR, mode); 
     int fd = shm_open("/ipc_shm", O_RDWR, 0); 

     return 0; 
} 

mit gcc test.c -Wall -lrt Werke zusammengestellt, wie erwartet:

$strace ./a.out 
.... 
statfs("/dev/shm/", {f_type=0x1021994, f_bsize=4096, f_blocks=22290, f_bfree=22290, f_bavail=22290, f_files=55725, f_ffree=55723, f_fsid={0, 0}, f_namelen=255, f_frsize=4096}) = 0 
futex(0xb6f5d1c0, FUTEX_WAKE_PRIVATE, 2147483647) = 0 
open("/dev/shm/ipc_shm", O_RDWR|O_CREAT|O_NOFOLLOW|O_CLOEXEC, 0777) = 3 
fcntl64(3, F_GETFD)      = 0x1 (flags FD_CLOEXEC) 
open("/dev/shm/ipc_shm", O_RDWR|O_NOFOLLOW|O_CLOEXEC) = 4 
exit_group(0)  

Bitte führen Sie strace auf Ihre Bewerbung und für alle Vorkommen von ipc suchen, und vielleicht chroot() . Vielleicht löscht etwas die Datei?