Creare una struttura dati condivisa

di il
3 risposte

Creare una struttura dati condivisa

Salve qualcuno sà dirmi come posso creare una struttura di dati condivisa
in un server scritto in c?

3 Risposte

  • Re: Creare una struttura dati condivisa

    Potresti utilizzare le funzioni per gestire la memoria condivisa appartenenti agli header: sys/ipc.h e sys/shm.h

    in particolare: shmget,shmat,shmdt e shmctl

    Ti scrivo un po' di codice per farti vedere come funziona il meccanismo, ma poi ti conviene documentarti bene su questi meccanismi.

    Prima di tutto ti crei la struttura:

    stuct prova{
    int var1;
    char var2;
    } *punt;

    poi crei l'area di memoria condivisa con la shmget

    shmid = shmget(KEY,sizeof(struct prova),flags); //flags valore num per specificare i diritti di accesso

    punt = shmat(KEY,0,SHM_RND);//attacchi l'area di memoria condivisa allo spazio di indirizzamento del processo

    poi con
    punt->var1
    punt->var2
    puoi smanettare sulla struttura condivisa.

    Riguardo alle altre due funzioni:
    shmdt, serve per scollegare il segmento dallo spazio di indirizzamento del processo;
    shmctl, serve per eliminare il segmento, il che provoca lo scollegamento di esso da tutti gli spazi di indirizzamento dei processi che facevano accesso ad esso.

    Molto importante è il valore KEY, per ottenere la condivisione del segmento, tale valore deve essere uguale per tutti i processi che vuoi che condividano tale segmento e per ottenere ciò puoi ad esempio definirlo come costante in un file header da te creato, di cui farai l'include.

    Se invece vuoi far condividere tale segmento tra un processo padre e i suoi figli, non ci sono problemi, dopo che hai fatto shmget e shmat, fai le fork per la creazione dei figli, essi erediteranno una copia dello stack del padre.

    Sono stato molto sbrigativo, anche se le cose da spiegare erano molte di più, ti conviene quindi documentarti su queste funzioni oppure chiedimi pure chiarimenti sugli aspetti che non ti quadrano e io ti risponderò.

    Inoltre dimenticavo di dirti che questi meccanismi funzionano solo su Unix e suoi derivati (cioè Linux), in quanto vengono usate syscall di tali SO
  • Re: Creare una struttura dati condivisa

    Come va dichiarato shmid
  • Re: Creare una struttura dati condivisa

    Sto facendo le mie prime prove con il fork questa cosa qua dovrebbe funzionare?
    
    #include "sys/types.h"
    #include "sys/wait.h"
    #include "unistd.h"
    #include "stdio.h"
    #include "stdlib.h"
    #include "linux/gpio_syscalls.h"
    #include "sys/ipc.h"
    #include "sys/shm.h"
    
    #define flags 1
    #define KEY 1
    struct prova
    {
    	int var;
    	
    }*prova; 
    int main(void)
    {
    	int rtc;
    	int sec,shmid;
    	rtc=fork();
    	shmid=shmget(KEY,sizeof(struct prova),flags);//flags valore num per specificare i diritti di accesso 
    	prova=shmat(KEY,0,SHM_RND);//attacchi l'area di memoria condivisa allo spazio di indirizzamento del processo 
    	prova->var=1;
    	if (rtc==0)
    	{
    		printf("Child: Fork\n");
    		printf("Child: DL1 on\n");
    		gpioclearbits(PORTA, PA3);
    		sleep(7);
    		printf("Child: DL1 off\n");
    		gpiosetbits(PORTA, PA3);
    		prova->var=5;
    		return EXIT_SUCCESS;
    	}
    	printf("Parent: Fork\n");
    	for (;;)
    	{
    		//sleep(1);
    		if (prova->var!=5)
    		{
    			printf("Ciao");
    			exit(1);
    		}
    	}
    	wait(NULL);
    	return EXIT_SUCCESS;
    } 
    
    [/code]
Devi accedere o registrarti per scrivere nel forum
3 risposte