Ошибка сегментации при доступе к структуре, заполненной данными, прочитанными из канала - PullRequest
0 голосов
/ 20 апреля 2011

У меня постоянно возникает ошибка сегментации при попытке доступа к структуре с именем Request, заполненной данными, считанными из канала. Что не так с моим кодом? Ошибка выдается здесь простым printf, пытающимся напечатать имя поля

ОПРЕДЕЛЕНИЕ КОНСТРУКЦИИ:

typedef struct 
{
    char code;      
    pid_t pid;       
    char *name;      
    char *object;    
    int id;          
    void *buffer;    
    size_t size;     
} Request;

КОД ПИСАТЕЛЯ:

request.code   = MANADDUSER;   /* macro defining a char */
request.pid    = getpid();
request.name   = argument1;   /* dinamycally allocated string */
request.object = NULL;
request.id     = 0;
request.buffer = NULL;
request.size   = 0;
if((fifoto = open(FIFOTOMMBOXD, O_WRONLY)) == -1)   logMmboxman("error in opening FIFOTO\n", 1); 
else                                                logMmboxman("opened FIFOTO\n", 0);  

if((write(fifoto, &request, sizeof(Request))) != sizeof(Request))   logMmboxman("error in writing FIFOTO\n", 1);
else                                                                logMmboxman("written on FIFOTO\n", 0);
close(fifoto);

КОД ЧИТАТЕЛЯ:

if((fifoto = open(FIFOTOMMBOXD, O_RDWR)) == -1)   logMmboxd("error in opening FIFOTO\n", 1); 
else                                              logMmboxd("opened FIFOTO\n", 0);  

if((read(fifoto, &request, sizeof(Request))) != sizeof(Request))   logMmboxd("error in reading FIFOTO\n", 1);
else                                                               logMmboxd("read from FIFOTO\n", 0);
close(fifoto);

printf("%s\n", request.name);

Ответы [ 3 ]

4 голосов
/ 20 апреля 2011

Возможно, вы отправляете адрес Request.name по каналу.Когда получатель получает его, Request.name явно указывает на неверную память.

2 голосов
/ 20 апреля 2011

Это можно исправить, изменив структуру на что-то вроде:

typedef struct 
{
    char   code;      
    pid_t  pid;       
    char   name[SOMESIZE];
    char   object[SOMEOTHERSIZE];
    int    id;          
    size_t size;     
} Request;

и внесите соответствующие изменения в читателя и писателя.Если канал подключен между процессами, адреса, содержащиеся в name, object и buffer, не имеют смысла в новом контексте.

1 голос
/ 20 апреля 2011

Вы передаете флаг, который вы ожидаете открыть в коде Читателя?

Я бы ожидал, что вы хотите O_RDONLY, а не O_RDWR.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...