2014-12-15 2 views
1
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/shm.h> 
int main() 
{ 
    int shmid; 
    char *viraddr; 
    char buffer[BUFSIZ]; 
    shmid=shmget(1234,BUFSIZ,0666|IPC_CREAT); 
    viraddr=(char*)shmat(shmid, 0,0); 
    while(1) 
    { 
     puts("Enter some text:"); 
     fgets(buffer,BUFSIZ,stdin); 
     strcat(viraddr,buffer); 
     if(strncmp(buffer,"end",3)==0) 
      break; 
    } 
    shmdt(viraddr); 
    exit(0); 
} 

Я изучаю общую память. Я хочу реализовать связь между двумя процессами. Когда я запускаю эту программу, она всегда указывает на эту ошибку - segmentation fault core dumped. Любая помощь по этому поводу? Благодарю.Общая память: сегментная ошибка ядра сбрасывается

+0

Работает отлично для меня ... Fedora 20 64 бит, + valgrind ... –

+4

Я считаю, что вы должны использовать 'strcpy' вместо' strcat', потому что вы не знаете, есть ли мусор в памяти на ' viraddr'. Почему это работает для dgunchev, вероятно, потому, что память в адресе, возвращаемом 'shmat', просто оказалась 0s. – Nard

+1

Нет, это работает, потому что 'IPC_CREAT' используется для создания нового сегмента ... и, когда создается новый сегмент разделяемой памяти, его содержимое инициализируется нулевыми значениями. См. 'Man 2 shmget'. –

ответ

1

Здесь и viraddr, и буфер имеют одинаковый размер. Для strcat() рекомендуется, чтобы размер dst был по крайней мере байтом больше размера src. В viraddr должно быть достаточно места для хранения данных буфера, чтобы избежать переполнения буфера.

+1

Это не имеет никакого отношения к этому. Когда создается новый сегмент разделяемой памяти, его размер равен значению «BUFSIZ», округленному до кратного «PAGE_SIZE». Если общий контент не превысил 'BUFSIZ' (округленный до ближайшего' PAGE_SIZE'), это не применяется. –

+1

это работает, спасибо. –

0

Возможно, иногда распределение памяти возвращает FFFFF, а затем выбрасывает Segmentation Fault Core Dumped. Причина в том, что у вас недостаточно прав на доступ к памяти для ваших процессов.

Просто используйте sudo, чтобы скомпилировать и запустить код. Например, у вас есть эти файлы

shm1.c
shm2.c
shm.h

Тогда ваши команды должны быть запущены следующим

sudo gcc shm1.c -o s1 
sudo gcc shm2.c -o s2 
sudo ./s1 & 
sudo ./s2 

Если у вас готовы сделать это на двух разных терминалах, просто пожар sudo ./s1 в терминале1 & sudo ./s2 в разных терминалах al 2

Смежные вопросы