struct als shared memory / semaphores



  • hallo,

    hab probleme beim zusammenspiel der 3 oben genannten komponenten. ich versuche ein shared memory segment zu erstellen, welches aus ein struct aus 2 unsigned int besteht. dann werden 2 semaphoren erzeugt, welche dafür zuständig sein sollen, das 2 prozesse ( fork) via den shared memory miteinander arbeiten können.(child soll 2 u-int einlesen und im shared memory speichern, danach der parent diese addieren und ausgeben.

    Ich bekomme beim ausführen immer speicherzugriffsfehler und gebe zu das ich mit denn ganzen pointern , sharedmemory speicher etc auch den überblick verloren habe. kann jemand helfen?

    #define SHAREDMEM_SIZE 4096
    typedef struct add{
    	unsigned int one;
    	unsigned int two;
    }values;
    values *v;
    
    void server();void client() ;
    void *x;
    sem_t *ser;sem_t *cli;
    
    int main() 
    {
    	int id = shmget(IPC_PRIVATE, SHAREDMEM_SIZE,IPC_CREAT|IPC_EXCL); 
    	v = shmat(id, NULL, 0 ); 
    	ser = (sem_t *)v; 
    	cli = (sem_t *)v+1;
    	sem_init(ser,1,0); 
    	sem_init(cli,1,1);
    
    	setbuf(stdout, NULL);
    	pid_t pid = fork();
    	if ( pid == 0 ) {
    		 client();
    	} else if ( pid > 0 ) 
    	{
    		server();
    		waitpid(pid,NULL,0);
    	}
    	else if ( pid == -1 )perror("fork fails");
    }
    void client() {
    	for(;;) {//50
    		sem_wait(cli);
    		scanf("%u%u",&v->one,&v->two);
    		sem_post(ser);
    		if(v->one == -1) break;
    		printf("%u", v->one);
    	}
    	if(shmdt(x)==-1) perror(NULL);
    	exit(1);
    }
    void server()
    {
    	for(;;) {
    		sem_wait(cli);
    		if( v->one==-1) break;
    		printf ( "Ergebniss= %u\n", (unsigned int)(v->one  + v->two));
    		sem_post(ser);
    	}
    }
    


  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (C89 und C99) in das Forum Linux/Unix verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.




Anmelden zum Antworten