View Full Version : [C] Segmentation Fault su chiamata shmget()
megamello
24-10-2006, 23:34
non riesco a far funzionare come si deve questo semplice prog:
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char* argv[]){
int ds_shm;
key_t key = 001000; // ho anche provato long key=30
if ((ds_shm = shmget(key, 20480, IPC_CREAT|0666))<0){
puts("Errore shmget");exit(-1);}
}
ogni volta ottengo un seg. fault anche se occasionalmente (1 o 2 volte) è apparso "Errore Shmget" da me definito. Dato ke sono veramente niubbo col C, mi potreste dare una mano e anche spiegarmi il motivo? grazie
ilsensine
25-10-2006, 09:46
Sembra sostanzialmente corretto; traccia il segfault con gdb per capire cosa succede.
Ho provato il tuo codice su Suse linux 10.1 (Kernel 2.6.16.21-0.25-smp, gcc 4.1.0-25) e funziona perfettamente.
beppegrillo
25-10-2006, 10:57
la butto là, hai /dev/shm montato?
ilsensine
25-10-2006, 11:06
Non credo che shm sia necessario per shmget/shmat...
megamello
25-10-2006, 11:10
@fidel: io lo compilo su SuSE 10.0 e non ne vuol sapere... ho però tralasciato il fatto che mi trovo sotto macchina virtuale tramite VmWare (anche se ho provato il codice su un'altra macchina con SuSE 10.0 non in VM e ancora niente...
@beppegrillo: a meno che non sia montato d default, non ho montato nient'altro, uso linux solo x compilare
come faccio a tracciare il codice con gdb? ci ho provato ma mi dava qualche errore, forse sbagliavo sintassi...mi dareste quella corretta? Grazie
beppegrillo
25-10-2006, 11:11
Non credo che shm sia necessario per shmget/shmat...
Cercando in rete, pare ora sia necessario montarlo, da un ng
Yes, you didn't search hard enough ;) shared memory is handled on a virtual
filesystem and must be mounted now.
put this or similar into your fstab:
# grep shm /etc/fstab
shmfs /dev/shm shm defaults 0 0
If you use devfs, remember to add the following to your first stage boot
script.
# grep shm /etc/rc.d/*
/etc/rc.d/rc.S: mkdir /dev/shm
P.s Se aggiungi una perror forse è meglio :)
Puoi postare il contenuto di /etc/fstab?
cat /etc/fstab per intenderci ;)
@beppegrillo
Mmmh, non mi quadra... Sulla mia suse 10.1 (che ha lo stesso fstab di Suse 10.0), /dev/shm non è montato, eppure funziona normalmente.
EDIT: come non detto, /dev/shm esiste, ma non viene montato in /etc/fstab... Vado a dare un'occhiata nei runlevels.
ilsensine
25-10-2006, 11:22
Cercando in rete, pare ora sia necessario montarlo, da un ng
E' necessaria per shm_open; dal trace non lo vedo necessario per shmget.
beppegrillo
25-10-2006, 11:27
E' necessaria per shm_open; dal trace non lo vedo necessario per shmget.
si hai ragione per shm_open ;)
ilsensine
25-10-2006, 11:29
come faccio a tracciare il codice con gdb? ci ho provato ma mi dava qualche errore, forse sbagliavo sintassi...mi dareste quella corretta? Grazie
gdb <programma>
esegui run
Quando/se si blocca, esegui
where
e posta il risultato.
In alternativa puoi fargli generare un core dump ed esaminarlo a posteriori con gdb.
E' necessaria per shm_open; dal trace non lo vedo necessario per shmget.
Eppure... è vero che tmpfs (montato su /dev/shm) è necessario per shm_open, però la shmget() ha bisogno della shared Memory SysV (presente in linux...) comunque.
EDIT: ah, almeno sulla suse 10.1, tmpfs (su /dev/shm) viene montato direttamente dal kernel (ecco perché non è presente in fstab)
ilsensine
25-10-2006, 11:33
Eppure... è vero che tmpfs (montato su /dev/shm) è necessario per shm_open, però la shmget() ha bisogno della shared Memory SysV (presente in linux...)
Sì linux usa internamente la shm per diverse cose, ma non è sempre necessario che sia fisicamente "montata" (basta che sia presente nel kernel).
megamello
25-10-2006, 12:26
grazie per l'aiuto, problema risolto....l'errore era in realtà in un'altra funzione...grazie a tutti x l'aiuto
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.