PDA

View Full Version : Comunicazione fra processi separati con memoria condivisa


Mante80
09-12-2005, 18:58
Sto cercando di far funzionare questo programmino che ho trovato su internet perchè mi serviva da esempio per fare un esercizio più complesso. Il problema è che, quando l'ho fatto girare la prima volta ho fatto partire solo il primo modulo ed è andato. La seconda volta ha dato un segmentation fault (la stessa cosa succede se faccio partire anche solo il secondo). Il problema dovrebbe essere causato dal settore di memoria che sono andato a scrivere e che non è stato pulito. Ho provato anche a riavviare il pc ma niente. Non so cosa fare (se metto come primo campodella shmget IPC_PRIVATE funziona naturalmente ma non ho modo di far comunicare i due processi). Cosa posso fare? Grazie a tutti quelli che mi risponderanno

// processo 1
main() { int shmid1; char *addr1;
int key=1;
shmid1 = shmget(key,100*sizeof(char),0600);
addr1 = (char *) shmat ( shmid1, 0, 0);
// assegno un valore al primo carattere
*addr1='A';
printf("proc1: prima, carattere: %c\n", *addr1);
// attendo che l'altro processo scriva
sleep(10);
// dovrei stampare B
printf("proc1: dopo, carattere: %c\n", *addr1);
shmctl(shmid1,IPC_RMID,NULL);
}
// processo 2
main() {
int shmid1; char *addr1;
int key=1;
shmid1 = shmget(key,100*sizeof(char),0600);
addr1 = (char *) shmat ( shmid1, 0, 0);
// LEGGO
printf("proc2: prima carattere: %c\n", *addr1);
*addr1='B';
shmdt(addr1);

pietro84
10-12-2005, 14:27
Sto cercando di far funzionare questo programmino che ho trovato su internet perchè mi serviva da esempio per fare un esercizio più complesso. Il problema è che, quando l'ho fatto girare la prima volta ho fatto partire solo il primo modulo ed è andato. La seconda volta ha dato un segmentation fault (la stessa cosa succede se faccio partire anche solo il secondo). Il problema dovrebbe essere causato dal settore di memoria che sono andato a scrivere e che non è stato pulito. Ho provato anche a riavviare il pc ma niente. Non so cosa fare (se metto come primo campodella shmget IPC_PRIVATE funziona naturalmente ma non ho modo di far comunicare i due processi). Cosa posso fare? Grazie a tutti quelli che mi risponderanno

// processo 1
main() { int shmid1; char *addr1;
int key=1;
shmid1 = shmget(key,100*sizeof(char),0600);
addr1 = (char *) shmat ( shmid1, 0, 0);
// assegno un valore al primo carattere
*addr1='A';
printf("proc1: prima, carattere: %c\n", *addr1);
// attendo che l'altro processo scriva
sleep(10);
// dovrei stampare B
printf("proc1: dopo, carattere: %c\n", *addr1);
shmctl(shmid1,IPC_RMID,NULL);
}
// processo 2
main() {
int shmid1; char *addr1;
int key=1;
shmid1 = shmget(key,100*sizeof(char),0600);
addr1 = (char *) shmat ( shmid1, 0, 0);
// LEGGO
printf("proc2: prima carattere: %c\n", *addr1);
*addr1='B';
shmdt(addr1);


è da un po che non mastico più queste cose... cmq già i due programmi mi sembrano scritti in maniera pessima(a parte che per aspettare che un altro processo scriva non si chiama la primitiva sleep(),è una cattiva pratica di programmazione),cmq shmctl(..),shmdt(...), shmat(..),shmget(..)non ricordo cosa fanno precisamente,non mi sembrano metodi posix. se mi dici che fanno di preciso e quali sono i parametri di ingresso vedo se posso aiutarti.
anche senza conoscere bene il metodo shmget in questa riga sembra che ci sia qualcosa che non va.
shmid1 = shmget(key,100*sizeof(char),0600);

Mante80
10-12-2005, 15:22
è da un po che non mastico più queste cose... cmq già i due programmi mi sembrano scritti in maniera pessima(a parte che per aspettare che un altro processo scriva non si chiama la primitiva sleep(),è una cattiva pratica di programmazione),cmq shmctl(..),shmdt(...), shmat(..),shmget(..)non ricordo cosa fanno precisamente,non mi sembrano metodi posix. se mi dici che fanno di preciso e quali sono i parametri di ingresso vedo se posso aiutarti.
anche senza conoscere bene il metodo shmget in questa riga sembra che ci sia qualcosa che non va.
shmid1 = shmget(key,100*sizeof(char),0600);
Ti ringrazio x la risposta. Il programma effettivamente è molto rudimentale ma serviva solo a titolo d'esempio per vedere come si passano dei dati in memoria condivisa due processi non legati da alcun legame. Ho risolto e il problema è effettivamente dove dici tu: mi è bastato modificare lo 0600 con IPC_CREAT per dire al programma di allocare un segmento nuovo. Ciao

pietro84
10-12-2005, 18:15
ok! ciao :D