Вы должны проверить возвращаемое значение каждой функции, которую вы использовали в своем коде. Ошибка сегментации произошла при вызове 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