how to pass data using shared memory and save the received data to file

13,215

For saving the data in a file, you can use file stream. For that you have to know about file streams.

Hope these link will help.

http://linux.die.net/man/3/fopen

http://en.wikipedia.org/wiki/C_file_input/output

Here comes the example program which I particularly typed, compiled and attached it for your reference.

#include<sys/types.h>
#include<string.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<stdio.h> 

struct mystruct // you can make your own structure if you want to pass many data
{
  int i;
  float f;
  char c;
  int arr[3];
}myObj = {1,1.1,'C',{100,1000,10000}};


main()
{
  int shmid;
  char* addr1;
  key_t key;
  //file to key. Generates a unique key
  key = ftok("/home/muthu/Desktop/anyfile.txt",'T');
  shmid = shmget(key,sizeof(struct mystruct),IPC_CREAT|SHM_R|SHM_W);
  printf("shmid = %d",shmid);
  addr1 = shmat(shmid,0,0);
  printf("\nIPC SHARED MEMORY");
  //copying your structure at the shared location.
  memcpy(addr1,&myObj,sizeof(myObj));
  printf("\nMESSAGE STORED");
}

And for shared memory 2.....

//<All necessary header files>
//<same my struct declaration here>
main()
{
  int shmid;
  char* addr1;
  FILE* fp;
  key_t key;

  struct mystruct* myObj2;
  //Generate the same unique key. Must provide the same file here too.
  key = ftok("/home/muthu/Desktop/anyfile.txt",'T');
  shmid = shmget(key,sizeof(struct mystruct),SHM_R|SHM_W);
  addr1 = shmat(shmid,0,0);
  myObj2 = (struct mystruct*)malloc(sizeof(struct mystruct)*1);
  if(shmid == -1)
    printf("\nShared memory error");
  //Retrieve the stored information, form the shared location.
  memcpy(myObj2,addr1,sizeof(struct mystruct));
  fp = fopen("/home/muthu/Desktop/MyFile.txt","w"); //open a file stream
  if(fp == NULL) 
    printf("\nError on opening file stream.\n");
  fprintf(fp,"\nIPC SHARED MEMORY");
  fprintf(fp,"\nMESSAGE RECIEVED FORM THE SHARED MEMORY  IS..\n");
  fprintf(fp,"\ninteger: %d",myObj2->i);
  fprintf(fp,"\nfloat: %f",myObj2->f);
  fprintf(fp,"\nchar: %c",myObj2->c); //write to the file
  fprintf(fp,"\narr: %d %d %d",myObj2->arr[0],myObj2->arr[1],myObj2->arr[2]);
  fprintf(fp,"\nDATA RECIEVED.");  
  fclose(fp); //close the file stream
  printf("\nMessage successfully stored!");
}
Share:
13,215
maddy
Author by

maddy

Updated on June 05, 2022

Comments

  • maddy
    maddy almost 2 years

    I am new to linux environment. I just know the basics of C. I am trying to learn linux programming. For this I am trying an example on shared memory. Please someone help me with this example. I am trying to send person details (like name, phone number & address) to another process using Shared memory. After receiving the data by the second process, I am trying to save received data into a file. This is the task I am doing. I am able to send just the name and receive it in the second process. Can someone please help how to send the data(like name, phone number & address) to second process and in the second process it must print the data and it should save the data to a file. Here is my code:

    address.c
    
    char *shared_memory;
    int main()
    {
      int select;
      int segment_id;
      char* shared_memory;
      int segment_size;
      key_t shm_key;
      const int shared_segment_size = 0x6500;
      shm_key = ftok("/home/madan/programs/shm_tok",'C');
      if(shm_key < 0) {
        printf("failed to create the key %s\n",strerror(errno));
      }
      /* Allocate a shared memory segment. */
       segment_id = shmget (shm_key, shared_segment_size,
                IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR);
        if(segment_id < 0) {
          printf("error geting the segment id %s\n",strerror(errno));
        }
        printf("segment ID:%d\n", segment_id);
       /* Attach the shared memory segment. */
       shared_memory = (char*) shmat (segment_id, 0, 0);
       printf ("shared memory attached at address %p\n", shared_memory);
    
    /* I want to send these details to the shared memory. Can someone suggest me the correct way to send these details to shared memory so that second process can retrieve them*/
    
       sprintf(shared_memory, "maddy\n");
       sprintf(shared_memory, "767556686");
       sprintf(shared_memory, "Ontario");
    
     system("./address-insert");
          /* Detach the shared memory segment. */
      shmdt (shared_memory);
       /
    
        * Deallocate the shared memory segment.*/
               shmctl (segment_id, IPC_RMID, 0);
    }
    

    addres-insert.c
    
    int main ()
    {
      int segment_id;
      char* shared_memory;
      FILE *fp;
      char *name;
      int segment_size;
       key_t shm_key;
      shm_key = ftok("/home/madan/programs/shm_tok",'C');
      const int shared_segment_size = 0x6500;
      /* Allocate a shared memory segment. */
      segment_id = shmget (shm_key, shared_segment_size,
                  S_IRUSR | S_IWUSR);
      if(segment_id < 0) {
        printf("error:[%s]",strerror(errno));
      }
      printf("segment id %d\n",segment_id);
      /* Attach the shared memory segment. */
      shared_memory = (char*) shmat (segment_id, 0, 0);
      if(shared_memory == NULL) {
        printf("failed to attach the shared memory %s",strerror(errno));
      }
      printf ("shared memory2 attached at address %p\n", shared_memory);
      /* printing the data from shared memory send by first process*/
      printf ("name=%s\n", shared_memory);
    
      /*copying the data in shared memory so i can save them to a file*/
      strcpy(name, shared_memory);
      printf("%s", name);
      /*here i have to save the data to a file. But i don't know how to do it, can someone help me with this please*/
    
      /* Detach the shared memory segment. */
      shmdt (shared_memory);
      return 0;
    }
    
  • maddy
    maddy over 12 years
    it was not allowing me as i am not a registered user.
  • Muthu Ganapathy Nathan
    Muthu Ganapathy Nathan over 12 years
    @maddy you are registered user. But you doesnt have enough reputation. Atleast 15 reputation you must have