2013-03-31 3 views
1

Я создал два процесса. Один из них создает кусок разделяемой памяти, а другой пытается его прочитать. Ошибок компиляции в этом коде нет, но как-то процесс 2 ведет себя странно.Чтение Мусор с shmget

Способ 1:

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <sys/ipc.h> 
#include <sys/shm.h> 
#include <sys/sem.h> 
#include <unistd.h> 
#include <errno.h> 
#include <string.h> 
#include <signal.h> 
#define nDEVICES 3 
#define DEVICE_NAME_LIMIT 20 
typedef struct d_list 
{ 
    char d_name[DEVICE_NAME_LIMIT]; 
    int d_id; 

}device_mapping; 
int main() 
{ 
    key_t shared_memkey_D=ftok(".", 'D'); 
    int shared_memid_D=shmget(shared_memkey_D, nDEVICES*sizeof(device_mapping), 0777|IPC_CREAT|IPC_EXCL); 
    device_mapping *DEVICES = (device_mapping*)shmat(shared_memid_D,0,0); 

    strcpy(DEVICES[0].d_name, "DISK"); 
    strcpy(DEVICES[1].d_name, "PORT"); 
    strcpy(DEVICES[2].d_name, "PRINTER"); 
    DEVICES[0].d_id=1; 
    DEVICES[1].d_id=3; 
    DEVICES[2].d_id=2; 
} 

Способ 2:

#include <stdio.h> 
#include <errno.h> 
#include <string.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/ipc.h> 
#include <sys/shm.h> 
#include <sys/sem.h> 
#include <signal.h> 
#define nDEVICES 3 
#define DEVICE_NAME_LIMIT 20 
typedef struct d_list 
{ 
    char d_name[DEVICE_NAME_LIMIT]; 
    int d_id; 

}device_mapping; 

int main() 
{ 

    key_t shared_memkey_D=ftok(".", 'D'); 
    int shared_memid_D=shmget(shared_memkey_D, nDEVICES*sizeof(device_mapping), 0777); 
    device_mapping *DEVICES = (device_mapping*)shmat(shared_memid_D,0,0); 
    int i=0; 
    for (i=0; i<nDEVICES; i++) 
     printf("%s\t%d\n", DEVICES[i].d_name, DEVICES[i].d_id); 



} 

Процесс 2 читает весь мусор, и я не могу понять, что происходит не так, после нескольких попыток. Пожалуйста помоги.

EDIT:

Я скопировал ту программу здесь. Я сделал исправления. Его все еще дает мне мусор.

Процесс 2 печатает следующие:

DISK 11038

FG + 3

@ FG + 2

+0

Вы отметили сообщение «segmentation-fault». Где происходит SEGFAULT? – Maz

+0

Пожалуйста, опубликуйте вывод ipcs -m. Также вы не проверяете код возврата, и если вы запустили его один раз, и он был успешным, каждый последующий запуск программы 1 завершится неудачно. IPC_EXCL приведет к сбою, потому что вы, кажется, вызываете shmdt и shmct(), чтобы удалить общую память. –

+0

@Maz - Segfault происходит в процессе 2, когда я пытаюсь распечатать значения. – ibp73

ответ

2
/* process 1 */ 
typedef struct d_list 
{ 
    char d_name[DEVICE_NAME_LIMIT]; 
    int d_id; 
}device_mapping; 

и

/* process 2 */ 
typedef struct d_list 
{ 
    char * d_name; 
    int d_id; 
}device_mapping; 
?

: не такие же.

Изменить определение device_mapping для процесса 2 так же, как для процесса 1, используя массивы символов, но указатели на символы.

Для процесса 1 d_name использует DEVICE_NAME_LIMIT байт, для процесса 2 d_name использует 4 байта (32 бит) или 8 байтов (64 бит).


Я бы поместил определения общей структуры в общий файл заголовка, который включен обоими источниками pocesses.

+0

Прошу прощения. Я пробовал. По ошибке я опубликовал неправильную версию. Я редактировал свой пост. Пожалуйста, смотрите. Благодаря! – ibp73

+0

Я имею в виду, что он все еще дает мне мусор даже после тех изменений, которые вы предложили. – ibp73

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