Aller au contenu

[langage C] creation de processus multiples


stuff

Messages recommandés

Bonjour,

Voila, je dois faire un programme qui demande (entre autre) un nombre, et je dois créer autant de processus avec des forks. et les faires communiquer.

le problème c'est que je ne sais pas trop faire, je sais créer un processus fils, et meme deux processus fils, mais "manuellement", avec des boucles imbriquées.

mais comment faire avec un for ou un while?

étant donné que (apparement) les variable de type pid_t (retour du fork) et le descripteur du pipe doivent être unique...

enfin ca j'en suis pas ultra sur, je commence juste la programmation avec des processus.

parce que ce que moi j'arrive a créer c'est

1. pas dynamique du tout

2. très lourd en tant que boucles imbriquées (avec les tests et tout, la fonction qui me créé les processus devient vite bien grande et pas lisible du tout.

Merci d'avance.

Lien vers le commentaire
Partager sur d’autres sites

Pour créér les n fork() je ferais comme ca :

pid_t   pid;
int i;
int n; // Nombre de processus à créer

for(i = 0; i < n; i++)
{
pid = fork ();
if (pid > 0) {
	 /* Processus père on continue la boucle	 */
} else if (pid == 0) {
   break; 
	/* Processus fils on sort de la boucle pour que seul le père crée des fork()	 */
} else {
	 /* Traitement d'erreur */
}
}

Lien vers le commentaire
Partager sur d’autres sites

ensuite il faudra transférer le tableau et tout entre tes processus mais là je sais pas trop faire :(
Suivant ce que tu veux faire : dup/fd (pour passer par descripteurs de fichiers)

pipe, write et read pour les messages

kill (man 2 kill) et signal (man 2 signal) très utiles aussi

Sinon par sémaphore (man shmget, man shmat, man shmdt etc...)

EDIT : Ah autre solution (crade) aussi, passer les infos par fichier avec des fopen fclose...

Lien vers le commentaire
Partager sur d’autres sites

EDIT : Ah autre solution (crade) aussi, passer les infos par fichier avec des fopen fclose...

mais ô combien facile à mettre en oevre :transpi:

tu le fais par mémoire partagée comme l'a dit theo avec shmget, etc...

le segment de partage est conservé avec le fork(), donc tu créé clé avant de forker puis tu récupères l'adresse avec les fils après. :ouioui:

Lien vers le commentaire
Partager sur d’autres sites

Merci beaucoup

je teste tout a l'heure.

pour les communication, je pensais passer par des pipes pour les relations directes pere fils et des pipes nommés pour les relation autres (y a plusieurs niveau de processus dans le programme) mais j'ai pas encore regardé comment faire ces pipes la.

sinon j'avais aussi pensé au malloc, et le tableau qui va avec, en utilisant un struct qui me permet de rentrer les valeurs de pipe...

je teste tout ca et encore merci.

Lien vers le commentaire
Partager sur d’autres sites

bon alors la, j'arrive a faire des pipes anonyme pour pouvoir echanger des données entre les peres et les fils.

Mais il faut aussi que j'echange des données entre les fils.

Je pensais faire des pipes nommés, mais je n'arrive pas à envoyer autre chose que des caractères (un par un) et je voudrais envoyer des struct.

Comment faire?

j'utilise read et write, mais peut etre faut il mieux utiliser fread et fwrite non?

j'avoue que la gestion de fichier, j'y connais vraiment rien, et les pipes nommés, ca passe par des fichiers.

avez vous une idée? :iloveyou:

Lien vers le commentaire
Partager sur d’autres sites

ben à part en faisant de la mémoire partagée là par contre, je ne vois pas...

passer la struct complete ça revient à faire de la sérialisation, et en C, spa facile facile...

passer l'adresse, ok, mais il faut avoir les droits sur cette adresse.

donc on en revient à la mémoire partagée... :roll:

Lien vers le commentaire
Partager sur d’autres sites

ben à part en faisant de la mémoire partagée là par contre, je ne vois pas...

passer la struct complete ça revient à faire de la sérialisation, et en C, spa facile facile...

passer l'adresse, ok, mais il faut avoir les droits sur cette adresse.

donc on en revient à la mémoire partagée... :mdr:

ouai mais bon la memoire partagee ca m'a l'air bien compliqué...

passer un tableau c'est possible?

francheement les exemples que j'ai vu sur la memoire partagee m'ont parues bien bien compliquées... :fou:

Lien vers le commentaire
Partager sur d’autres sites

ben concretement, comment tu veux "passer un tableau" ?

je veux dire physiquement...

soit il change d'endroit dans la mémoire (on le recopie d'un espace réservé au process A vers un espace réservé au process B), et là, bonjour la lourdeur de la procédure...

j'imagine l'usine à gaz : "tiens, voilà un octet, y en a encore 421567 qui attendent..." "ohhh un octet!!! va falloir que je realloue mon tableau..." :francais:

sans compter les problème de synchro à gérer, et tout et tout...

soit les process A et B ont tous les deux des droits sur l'endroit on se trouve ton tableau, ce que je trouve plus simple et plus rapide... :chinois:

Lien vers le commentaire
Partager sur d’autres sites

Je vois pas ce que tu te casses la tête à dire que la sérialisation en C c'est pas top? :o

Je ne sais pas quelles sont tes données, mais s'il ne s'agit pas de données récursives tu peux très bien faire cela :

struct machin* ptr; = tableaux de ptrNb données
int ptrNb = nombre de données;

FILE* f = fopen("file", "wb" );
fwrite(&ptrNb, sizeof(int), 1, f);
fwrite(ptr, sizeof(struct machin), ptrNb, f);
fclose(f);

et d'utiliser fread() pour relire les données (tu changes pas de machines à priori, donc ça ira)

C'est exactement le même principe que le mmap (pour mapper un fichier en mémoire :))

Lien vers le commentaire
Partager sur d’autres sites

Je vois pas ce que tu te casses la tête à dire que la sérialisation en C c'est pas top? :o

Je ne sais pas quelles sont tes données, mais s'il ne s'agit pas de données récursives tu peux très bien faire cela :

struct machin* ptr; = tableaux de ptrNb données
int ptrNb = nombre de données;

FILE* f = fopen("file", "wb" );
fwrite(&ptrNb, sizeof(int), 1, f);
fwrite(ptr, sizeof(struct machin), ptrNb, f);
fclose(f);

et d'utiliser fread() pour relire les données (tu changes pas de machines à priori, donc ça ira)

C'est exactement le même principe que le mmap (pour mapper un fichier en mémoire :))

oula... c compliqué pour moi ca.

en fait, j'ai pas beaucoup de data a transférer, mais assez souvent (taux de rafraichissement).

sinon ton ptrNb c'est quoi? le nombre de données qu'il y a dans le tableau?

je vais essayer. Moi j'en etais resté au read/write, mais je vais essayer fread et fwrite.

sinon mmap jamais entendu parler mais je vais regarder.

A vrai dire, je suis pas tres bon en C, et la memoire partagee, avec les semaphore et tout, c bien compliqué pour moi. J'ai trouvé des exemple mais bon je comprend pas grand chose.

mais la solution des pipes nommés est plus simple apparement.

La, avec les fonction read/write, j'arrive a envoyer caractère par caractère mes données.

C'est pas tres pratique et c'est pour ca que je vais regarder fwrite et fread.

Merci beaucoup en tout cas.

Lien vers le commentaire
Partager sur d’autres sites

fread appelle read en interne. Ce que je te propose c'est d'utiliser les librairies standards.

alors j'ai essayé.

sans utiliser de pipes nommés, ca marche pour envoyer ma structure. mais dès que j'utilise les pipes nommés, alors les processus se mettent en dead lock.

bloqués.

nulle part je n'ai vu d'exemples de pipes nommés avec des fread ou fwrite donc je pense que c'est incompatible.

par contre, avec read et write, j'arrive a transmettre un caractère (mais je veux envoyer des int, et de préférence dans une structure).

est-il possible d'envoyer des struct dans un write et dans un read?

Lien vers le commentaire
Partager sur d’autres sites

fread et fwrite sont la même chose que read et write mais pour des fichiers (f comme flow).

passer par des fichiers c'est encore plus lent et cracra que de le passer octet par octet à travers le pipe... :fumer:

(cf le post de theo...)

oui, normalement tu peux envoyer une structure dans un read/write, il faut juste faire qaffe à 1. copier le bon endroit en mémoire 2. ne pas faire d'overflow en sortie

Lien vers le commentaire
Partager sur d’autres sites

  • 3 semaines après...

Genre un dérivé de ce qu'il y a dans ma signature ? :cartonrouge:

Oui :francais:

Sinon pour la communication interprocess perso je suis plus pour les pipe simple (un bon int fd[2];pipe(fd) :chinois: ) ou bien les pipes nommés mais seulement lorsque les process ne sont pas "parents" (sinon voir pipe :chinois: )

Les IPC perso j'ai jamais aimé :chinois:

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...