Newsgroup: it.comp.lang.c
Titolo: condivisioni & shmget

ed eccomi gia' a fare una domanda :)
allora, il problema e' questo:
in un progr in C [unix/c] devo far cominucare un processo figlio [forkettato]
con il padre, che sforna pargoletti con un bel ciclo for controllato
da un if del tipo  
if (il numero_di_bambini < NUM_MAX) {creane_un_altro();}
solo che il casino sta nel verificare QUANTI sono i figli in esecuzione.
Io l'ho risolto cosi': creo un area di memoria condivisa [unco modo che
ho scoperto per far comunicare papa' e bebe'] con dentro una variabile
contatore, dentro una struct. Il processo figlio all'inizio la incrementa,
alla fine prima di morire la decrementa. Il padre la verifica e se puo'
permetterselo crea altri figli.
Ora.. la documentazione che ho trovato e' scarsa, ma mi sono arrangiato 
in qualcosa di quuesto tipo:
 struct memtag {int thread_counter; } * tc;
 int memid, chiave=123456;    
[...]
 if ((memid=shmget(chiave, sizeof(struct memtag), 600|IPC_CREAT)) < 0 )
 if ((tc=(struct memtag *) shmat(memid,0,0)) <0 )
        {perror("shmat"); exit(-1);}
e poi accedo al dato indifferentamente dal processo con tc->thread_counter
il problema e' la chiave!
ovvero: l'unico riferimento manualistico che ho trovato si riferiva per
lo piu' a database, e quindi spiegava con creare la chiave a partire da
un nome d un file. Non e' il mio caso. Poi dava un esempio in cui la 
inizializava lui con un numeor a caso, appunto 123456.
il problema e' che in fase di esecuzione [simple user] mi dice a volte:
shmget: Permission denied
:-\
e altre volte funziona
Quando non funziona, se cambio la chiave [per esempio solo 12345], la prende,
altre volte no.
Naturalente da superuser questo problema non esiste.
Come posso risolvere il problema?
davvero la shmget() e' l'unica soluzione che fa per me?
perche' mi dice accesso negato?
devo per forza eseguire il progr da root?
ok.. finito [per ora :) ]
un grazie anticipato
ciao
fritz

_
fri...@inameiname.com
 wrote:
[ snip ]
fic>in un progr in C [unix/c] 
Il NG corretto e' it.comp.linux.development.
[ snip ]
fic> if ((memid=shmget(chiave, sizeof(struct memtag), 600|IPC_CREAT)) < 0 )
Perche' non usi
	...shmget(IPC_PRIVATE, ....
?
[ snip ]
fic>inizializava lui con un numeor a caso, appunto 123456.
Il problema del numero a caso sta nel fatto che la chiave puo' gia'
essere associata ad una struttura IPC.
fic>il problema e' che in fase di esecuzione [simple user] mi dice a volte:
fic>shmget: Permission denied
[bigfok@fokhouse test]$ cat test.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/wait.h>
int main()
{
    int shmid, *count;
    if ((shmid = shmget((key_t) 1234, sizeof(int), 0600 | IPC_CREAT)) < 0) {
        perror("shmget"); exit(1);
    }
    if ((count = (int *) shmat(shmid, (void *) 0, 0)) == (int *) -1) {
        perror("shmat"); exit(1);
    }
    printf("count is %d\n", ++*count);
    return 0;
}
[bigfok@fokhouse test]$ gcc -o test test.c -Wall -pedantic
[bigfok@fokhouse test]$ su -c "./test"
Password:
count is 1
[bigfok@fokhouse test]$ ./test
shmget: Permission denied
[bigfok@fokhouse test]$ su -c "./test"
Password:
count is 2
[bigfok@fokhouse test]$
Ciao ciao,
Andrea
-- 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and 
 the Ugly)."
(by Matt Welsh)

 solo che il casino sta nel verificare QUANTI sono i figli in esecuzione.
La prima cosa che mi viene in mente: per comunicare con il padre puoi
usare una bella pipe ; il padre tiene una variabile contatore per sapere
quanti figli sono in esecuzione che viene incrementata ad ogni fork
eseguita con successo e viene decrementata alla ricezione di un segnale
di "morte del figlio" (non ricordo come si chiama, forse SIGCHLD o
qualcosa di simile), che gestisci con un bel signal handler del tipo :
void signalhandler(int signum) {
  if (signum == SIGCHLD)   /* anche se superfluo */
	contatore ++;
  signal(SIGCHLD,signalhandler);  
/* altrimenti il prossimo segnale verra' trattato come da default */
}
L'idea dovrebbe essere buona, fammi sapere.
-- 
 Ciao, Luca.
 Reply to 
luca....@tiscalinet.it
 UIN : 43385135

 wrote:
per gli stessi motivi scritti 10 secondi fa chiedo anche a te se per 
cortesia potresti ripostarmi la risposta, devo aver fatto casini
con il news server locale, e mi killa la meta' dei post, scaricandomi
solo le intestazioni :(
grazie e ciao
fritz