2011-05-27 7 views
2

J'ai essayé de créer un bloc de mémoire partagée, et ce que j'ai obtenu est un comportement étrange.problème avec la mémoire partagée

#include <sys/shm.h> 
#include "stdio.h" 
#include <sys/ipc.h> 

int main() { 
printf("starting\n"); 

int mid = -1; 
mid = shmget((key_t)1234, 4096, IPC_CREAT|0666); 
if(mid == -1) { 
    printf("cant get mid\n"); 
    return 1; 
} else { 
    printf("got mid"); 
} 

int* maddr = 0; 
maddr = shmat(mid, NULL ,0); 
if(maddr == (int*)-1) { 
    printf("cant attach memory\n"); 
    return 1; 
} else { 
    printf("got maddr"); 
} 

while(1) { 
    int cval = __sync_add_and_fetch(maddr, 1); 
    if(cval % 2) { // odd values 
      printf("messager 1"); 
      sleep(1000); 
    } 
} 
} 

Si je tente d'exécuter ce code, il imprime à partir et se bloque, rien de plus arrive, mais certains pourquoi il accepte l'entrée de stdin, donc je peux imprimer comme si scanf est en cours d'exécution

Répondre

4

stdout est line-buffered par défaut, ce qui signifie qu'il n'est pas vidé jusqu'à ce qu'une nouvelle ligne soit imprimée. Cela signifie que vous devez mettre \n à la fin de votre "got mid", "got maddr" et "messager 1" cordes, ou fflush(); après ces printf() s. Par ailleurs, la mémoire partagée SYSV est obsolète. Les mécanismes POSIX sont nettement mieux conçus - voir shm_open() et les appels associés.

3

Essayez d'ajouter une nouvelle ligne (\n) à la fin de tous les de vos instructions printf. Je suppose qu'il échoue avant d'imprimer/rincer le tampon.

Vous pouvez entrer des données car le terminal ne bloque pas les séquences de touches, même si vous ne les avez pas interrompues pour les lire. Je tape régulièrement "next thing" alors que ma ligne de commande/terminal est occupé à faire quelque chose d'autre pour que ça reprenne juste quand c'est fait. Le tampon stdin peut toujours accepter l'entrée. Il ne l'utilise tout simplement pas encore.