Ошибка сегментации при использовании разделяемой памяти - PullRequest
1 голос
/ 15 февраля 2020

Этот код выполняет следующее: читает содержимое текстового файла «read» и записывает его в пространство общей памяти. Код работал до вчерашнего дня, но тот же код показывает ошибку сегментации сегодня. Можете ли вы помочь мне выяснить, где я допустил ошибку?

#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;

 }

1 Ответ

1 голос
/ 15 февраля 2020

Вы должны проверить возвращаемое значение каждой функции, которую вы использовали в своем коде. Ошибка сегментации произошла при вызове strcpy(a,buf);. Если вы проверяете значение a, у него нет действительного адреса памяти, потому что вы никогда не проверяли значение, возвращаемое при вызове shmat(), и вам необходимо тщательно проверить параметры, которые принимает эта функция (страница man).

Ниже я прокомментировал, где происходит ошибка сегмента:

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;

 }

Проверьте эту ссылку: http://www.csl.mtu.edu/cs4411.ck/www/NOTES/process/shm/shmat.html

...