Comment lire / écrire sur un mappage partagé anonyme?

Si vous tentez d’écrire un message dans la mémoire partagée anonyme avec un processus enfant, arrêtez-le. Ensuite, faites lire le message par le parent. J’ai vu des exemples de mappage de fichiers d’entrée et de sortie à l’aide de descripteurs de fichiers obtenus par le biais d’appels en read et en write . Mais je ne sais pas comment aborder cela correctement.

 int main(void) { char *shared; int status; pid_t child; shared = mmap(0, sizeof(int) , PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0); if (shared == MAP_FAILED) { perror("mmap"); return 1; } child = fork(); if ( child == -1 ) { perror("fork"); return 1; } else if (child == 0) { sprintf(shared, "foo"); } else { printf("%s", shared); wait(&status); } if (munmap (shared, sizeof(int)) == -1) { perror("munmap"); return 1; } return 0; } 

Si votre seul objective est de lire / écrire entre un processus enfant et un processus parent, utiliser des canaux est une méthode beaucoup plus simple. Cela ressemblerait à ceci:

  int fd[2]; pipe(fd); if((child= fork()) == -1) { perror("fork"); exit(1); } if(child == 0) { // close read side close(fd[0]); // write to pipe write(fd[1], msg, (strlen(msg)); } else { //close write side close(fd[1]); //read what the child wrote. nbytes = read(fd[0], buff, sizeof(buff)); } 

Si vous vous souciez de la mémoire partagée, il est alors ridicule d’essayer de la manipuler par des appels read() et write() sur le fichier sous-jacent (ce qui de toute façon pour un mappage anonyme n’existe pas). Si vous voulez communiquer via read() et write() créez simplement un tuyau et oubliez le mappage et la mémoire partagée. C’est en fait une approche tout à fait viable.

Si vous souhaitez vraiment utiliser la mémoire partagée pour cela, utilisez-la comme mémoire . Convertissez le pointeur dans la région de mémoire partagée en un type pointeur vers object approprié, utilisez l’affectation ordinaire pour écrire et utilisez un access variable / mémoire ordinaire pour le lire. La mémoire partagée pose des problèmes potentiels liés à des conflits d’access et de synchronisation, mais cela n’a rien de grave pour le cas simple que vous décrivez: il suffit d’ wait() processus parent wait() de l’enfant (ou soit averti de sa fin) avant de tenter de lisez ce que l’enfant a écrit.

Cependant, vous avez un problème avec la façon dont vous configurez votre mappage: vous mappez des octets sizeof(int) , mais ce n’est probablement pas suffisant pour le message que vous essayez d’écrire. Globalement, cela devrait ressembler davantage à ceci:

 int main(void) { char *message; int status; pid_t child; message = mmap(NULL, BUFSIZE , PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0); if (message == MAP_FAILED) { perror("mmap"); return 1; } child = fork(); if ( child == -1 ) { perror("fork"); return 1; } else if (child == 0) { strcpy( message, "foo\n"); } else { wait(&status); printf("The child wrote:\n%s\n", message); } return 0; }