VikariuS a écrit 3 commentaires

  • [^] # Re: man IPC

    Posté par  . En réponse au message communication entre fork() via un tableau en mémoire. Évalué à 2.

    J'ai déjà songé aux threads pour solutionner ma problématique, mais je me suis fixé comme contrainte l'usage du forker afin de satisfaire au mieux ma curiosité sur la communication inter-processus. Même si dans l'application cela reste assez laborieux pour le moment, je ne désespère pas pour autant ;)
  • [^] # Re: man IPC

    Posté par  . En réponse au message communication entre fork() via un tableau en mémoire. Évalué à 1.

    Autant pour moi, je voulais dire Castorpilot et non "man IPC"... -_-

    Les nuits sont courtes et la pause déjeuné se fait attendre ^_^
  • [^] # Re: man IPC

    Posté par  . En réponse au message communication entre fork() via un tableau en mémoire. Évalué à 2.

    En fait, je cherche à réaliser un jeu de parcours (jeu de l'oie) jouable en réseau: le serveur accueille plusieurs clients (joueurs) qui peuvent créer une partie ou en rejoindre une, chaque partie pouvant être sauvegardée pour être rejouée plus tard. J'ai donc utilisé un tube pour communiquer à chaque fork() un pointeur sur le tableau de données en mémoire préalablement initialisé. Après une semaine d'acharnement, un collègue m'a expliqué hier que le principe de fonctionnement de linux ne permet pas ce genre d'opération via l'utilisation de pointeurs... Voici donc la dernière version en date du code en question:
    [CODE C]
    ...
     
    char data[1000][2048];
     
    int main() {
     
    	...
     
    	if(pipe(tube)==-1) {
    		perror("failed");
    	}
     
    	...
     
    	strcpy(data[0],"test");
     
    	...
     
    	switch (pid=fork()) {
    		case -1: perror("failed");
    		case 0: child();
    		default: parent();
    	}
     
    }
     
    void child() { // fils
    	close(tube[1]);
    	if (read(tube[0],&data,2048)<0) {
    		write(newsock,"failed",256);
    	}
    	*pdata = &data;
    	close(tube[0]);
    	write(newsock,pdata,256); // renvoie "test1" au client
    	read(newsock,data[0],256); // réceptionne une saisie du client (exemple "test2")
    	write(newsock,data[0],256); // renvoie les données au client (exemple "test2")
     
     
    	// après avoir lancé un client qui a renseigné ses données,
            //  "test1" s'affiche chez les nouveaux clients au lieu de par exemple "test2"...
    }
     
    void parent() { // père
    	strcpy(data[0],"test1");
    	close(tube[0]);
    	write(tube[1];&data,2048);
    	close(tube[1]);
     
    }
     
    ...
    [/CODE C]
    
    L'idée fut que chaque ligne de ce tableau représente une concaténation des données d'une partie et que la première entrée (data[0]) face office de pseudo sémaphore: échec cuisant en soit ^_^ Il me reste une semaine de nuits blanches pour réaliser ce projet qui me peine dans sa réalisation. Merci man IPC mais, bien que commençant enfin à avoir une vague idée de comment faire, ce n'est pas encore gagné d'avance...