La Mémoire Partagée Avec Deux Processus En C?
Je veux faire ce qui suit:
Processus père crée un processus fils. Ensuite, le processus de l'enfant lit n int de l'utilisateur et de les stocker dans une mémoire partagée. Le processus parent puis les affiche.
J'ai atteint le suivant:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#define SHMSIZE 27
int main() {
int shmid;
int *shm;
int *n;
if(fork() == 0) {
shmid = shmget(2009, SHMSIZE, 0);
shm = shmat(shmid, 0, 0);
n = shm;
int i;
for(i=0; i<5; i++) {
printf("Enter number<%i>: ", i);
scanf("%d", n++);
}
printf ("Child wrote <%d>\n",shm);
shmdt(shm);
}
else {
wait();
int *s;
shmid = shmget(2009, SHMSIZE, 0666 | IPC_CREAT);
shm = shmat(shmid, 0, 0);
s = shm;
wait(NULL);
printf ("Parent reads <%d>\n",shm) ;
shmdt(shm);
shmctl(shmid, IPC_RMID, NULL);
}
return 0;
}
Et le résultat est juste cette ligne:
Enter number<1>:
Et si je suis entré dans un certain nombre, disons 25, il affiche ceci:
Parent reads <r>
r: aléatoire -ve numéro change à chaque fois que j'execute le code
Il n'est jamais allé à travers le processus de l'enfant code ! Suis-je le faire dans un mauvais sens ?
Pourquoi ne pas vous créer de la mémoire partagée dans le parent, puis exécutez l'enfant?
Qu'est-ce que le premier appel à
Aussi, votre argument
C'est ce qui m'a demandé de le faire. Je préfère m'en tenir à cela.
Qu'est-ce que le premier appel à
wait
dans le processus parent?Aussi, votre argument
scanf
est faux.C'est ce qui m'a demandé de le faire. Je préfère m'en tenir à cela.
wait()
est de forcer les parents à attendre pour l'enfant à la fin. Quel est le problème avec scanf()
?
OriginalL'auteur iTurki | 2011-11-18
Vous devez vous connecter pour publier un commentaire.
Ok, mieux recueillir dans une réponse à la place...
Il y a plusieurs problèmes avec vous programme. Si vous activez les mises en garde lors de la construction (j'utilise
-Wall -Wextra
) beaucoup d'entre eux seront tout à fait évident.Les deux premiers problèmes que j'ai déjà mentionné dans mes commentaires, mais je l'explique ici:
wait()
. Il n'y a pas dewait
fonction en C ou POSIX qui ne prend aucun argument.scanf
appelez, vous appelez avec*++
, où*n
prend la valeur de la mémoire pointée parn
qui risque peut entraîner une panne. Supprimer l'astérisque.n
) et comme une chaîne de caractères. Vous ne pouvez pas vraiment faire les deux, choisir l'un ou l'autre.Modifier je suis venu avec ce lieu, qui semble fonctionner pour moi. J'ai ajouté des commentaires sur les choses que j'ai changé.
Ne remarque que le point 5 dans la liste ci-dessus n'ont pas été résolus.
if(fork() == 0)
blocMis à jour. Vérifier maintenant. Encore sortie la même avec un peu de différence
J'ai oublié de mettre à jour la sortie. Il est maintenant à jour
Ajout d'un code à ma réponse, contenant mes modifications à votre programme.
Résolu. Merci à vous.
OriginalL'auteur Some programmer dude
Votre description, il semble ne pas être correcte, car il n'y a pas de code qui affiche "Parent Écrit <>".
Vous êtes la lecture de numéros et de les stocker en tant que int *n++, mais ensuite vous ajoutez un '\n' à la n-int tableau et vous traitez shm comme une chaîne de caractères?
Il me semble que dans votre enfance, vous êtes la création d'une mémoire partagée, l'écriture et la fermeture (jeter) la mémoire partagée. Puis votre deuxième partie s'ouvre dans une nouvelle mémoire partagée avec le même segment, mais pourtant, c'est une nouvelle mémoire partagée. Normalement un processus crée une mémoire partagée, puis le second s'ouvre et lorsque le dernier ferme la mémoire partagée, puis il est libéré par le système d'exploitation.
shmdt()
signifie: mémoire partagée abîmer.shmctl()
SHM détruire. Et quant à la sortie, c'est mal. Je vais le corriger.Désolé, je ne suis pas familier avec la SHM de l'API. Mais si le processus de l'enfant appels shmget et se termine plus tard ne serait pas linux implicitement détruire la SHM (avant que le processus parent ouvre)? Et pourquoi avez-vous IPC_CREAT sur le parent, et non sur l'enfant?
Enfant seulement d'ouvrir et de fermer la SHM. Puis, le parent s'ouvre de la même SHM, récupérer les données, de les fermer et de le détruire. C'est la façon dont il fonctionne.
OriginalL'auteur Werner Henze
Un problème, c'est que le processus de l'enfant est d'essayer d'utiliser get la mémoire partagée avant il a été créé par le parent. Le parent a un
wait()
appel avant la création de la mémoire partagée, donc il n'existe pas lorsque le client essaie de récupérer l'identifiant. Même si l'attente() l'appel est déplacé, il peut ne pas fonctionner car il y a une race condition. L'appel àshmget
peut-être besoin de faire précéder lefork
appel (ou d'utiliser certains de synchronisation pour s'assurer qu'il existe réellement avant de la récupérer dans le processus de l'enfant).Et (comme d'autres l'ont déjà souligné), l'enfant est de tenter d'écrire des nombres entiers de la mémoire lors de la lecture (impression) essaie de la traiter comme une chaîne de caractères.
OriginalL'auteur Mark Wilkins
Mon problème était si stupide. J'ai besoin de fournir à l'Enfant avec la capacité d'écrire dans la SHM. Cette ligne dans le si-bloc :
Sera comme ceci:
Merci à vous tous et surtout à @JoachimPileborg 🙂
J'ai voté pour sa réponse. Je ne peux pas accepter une réponse qui ne permet pas de résoudre le problème, puis-je ? 🙂
supposons code après le fork() est simultanée et/ou de l'un ou l'autre peut s'exécuter en premier. Ainsi, les deux shmget doivent avoir le IPC_CREAT, donc, qui fonctionne d'abord en créer un.
OriginalL'auteur iTurki