Advertisement
d1cor

shm_wrd

Aug 23rd, 2017
194
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.38 KB | None | 0 0
  1. /*******************************************
  2. * Author     : Diego Cordoba / @d1cor      *
  3. * Purpose    : juncotic.com  / um.edu.ar   *
  4. *******************************************/
  5.  
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <unistd.h>
  9. #include <sys/ipc.h>
  10. #include <sys/shm.h>
  11. #include <time.h>
  12. #include <string.h>
  13. #include <errno.h>
  14. #include <getopt.h>
  15. #include <sys/stat.h>
  16. #include <sys/mman.h>
  17. #include <sys/types.h>
  18. #include <fcntl.h>           /* For O_* constants */
  19.  
  20.  
  21. #define MEMSIZE 512
  22.  
  23. const char *progname;
  24.  
  25. char *shm_abre_y_mapea (size_t size, mode_t mode){
  26.     static int shm_id=0;
  27.     char *ptr;
  28.  
  29.     // creates shm segment on main memory
  30.     shm_id = shm_open("/test", O_CREAT | O_RDWR, mode);
  31.  
  32.     fprintf (stderr,"Usando shm_id=%d\n", shm_id);
  33.     if (shm_id < 0) return NULL;
  34.  
  35.     // grow segment to a fixed size
  36.     ftruncate(shm_id, size);
  37.  
  38.     // map segment into a private memory space in the process
  39.     ptr = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, shm_id, 0);
  40.  
  41.     return ptr;
  42. }
  43.  
  44. void usage (FILE * f, int exit_status){
  45.     fprintf (f, "ERROR: uso %s {-r | -w | -d }\n", progname);
  46.     exit (exit_status);
  47. }
  48.  
  49. int main (int argc, char * const argv[]){
  50.     int c, opt_read=0, opt_write=0, count=0;
  51.     char * ptr=NULL;
  52.     const char * ouch=NULL;
  53.     progname=argv[0];
  54.    
  55.     while((c=getopt(argc, argv, "rwd"))!=-1){
  56.         switch (c){
  57.             case 'r': opt_read++; break;
  58.             case 'w': opt_write++; break;
  59.             case 'd': shm_unlink("test"); return 0;
  60.             default: usage(stderr, 255); break;
  61.         }
  62.     }
  63.  
  64.     if (!(opt_read^opt_write))usage(stderr, 255);
  65.    
  66.     //crea y asigna la memoria a ptr
  67.     ptr = shm_abre_y_mapea(MEMSIZE, 0666);
  68.  
  69.     if (!ptr){
  70.         ouch="Obtener memoria compartida";
  71.         goto err;
  72.     }
  73.  
  74.  
  75.     if (opt_write){
  76.         int resto=MEMSIZE-1;
  77.         fprintf (stdout, "Leyendo del stdin .....resto\n");
  78.         //leo del stdin y lo asigno al segmento de memoria compartida
  79.         while ((count=read(STDIN_FILENO, ptr, resto))>0){
  80.             resto-=count;
  81.             if(resto<0){
  82.                 fprintf (stderr, "Se acabó el espacio\n");
  83.                 break;
  84.             }
  85.             ptr+=count;
  86.         }
  87.         if (count<0){
  88.             ouch="read()";
  89.             goto err;
  90.         }
  91.         ptr [count]=0;//asigno el caracter nulo al final del segmento
  92.     }
  93.     else if (opt_read){
  94.         fprintf (stdout, "Escribiendo en stdout......\n");
  95.         printf (ptr); //escribe el el stderr el contenido de la memoria
  96.     }
  97.     return 0;
  98. err:
  99.     fprintf (stderr, "Error: %s :%s\n", ouch, strerror(errno));
  100.     return 1;
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement