Mia
Mia

Reputation: 25

Segmentation fault while using shared memory

This code performs the following: Reads the contents of the "read" text file and writes it into the shared memory space.The code was working until yesterday but the same code shows segmentation fault today. Can you help me figure out where I'd made a mistake?

#include<sys/ipc.h>
#define NULL 0
#include<sys/shm.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h> 
#include<sys/wait.h> 
#include<ctype.h>
#include<fcntl.h>
#include<stdio_ext.h>

int main()
{

char *a;
char name[20];
int id,n;
char buf[50];
int fd;
fd=open("read",O_RDONLY);   
int s1=read(fd,&buf,50);

id=shmget(200,50,IPC_CREAT);

    a=shmat(id,NULL,0);
    strcpy(a,buf);
    wait(NULL);
    shmdt(a);

shmctl(id,IPC_RMID,NULL);
return 0;

 }

Upvotes: 1

Views: 989

Answers (1)

Konjit W
Konjit W

Reputation: 226

You have to check the return value of every function you used in your code. The segmentation fault occurred when you call strcpy(a,buf);. If you check the value of a it does not have a valid memory address, that is because you never checked the value returned from shmat() call and you need to carefully check the parameters that this function is taking(man page).

Below, I commented where the seg fault occurs:

int main()
{
  //char name[20]; // never used
  int id; 

  char *a;
  char buf[50];
  int fd;
  fd=open("read",O_RDONLY); // check return value
  //make sure you provide the correct path for your "read" text file
  int restlt = read(fd,&buf,50); // check return value


  key_t mem_key = ftok(".", 'a');
  id = shmget(mem_key, 50, IPC_CREAT | 0666);
  //id = shmget(200,50,IPC_CREAT); //check the return value
  if (id < 0) {
      printf("Error occured during shmget() call\n");
      exit(1);
  }
  a = shmat(id,NULL,0); //check the return value
  if ((int) a == -1) {
       printf("Error occured during shmat() call\n");
       exit(1);
  }
  printf("Value of pointer a = %p \n", a);
  strcpy(a,buf); // better to use strncpy(a, buf, n);

  printf("Value of a[0]  = %c \n", *a);

  wait(NULL);
  shmdt(a);
  shmctl(id,IPC_RMID,NULL);

  return 0;

 }

Check out this link: http://www.csl.mtu.edu/cs4411.ck/www/NOTES/process/shm/shmat.html

Upvotes: 1

Related Questions