2016-03-18 2 views
0

Я пытаюсь передать структуру из нескольких дочерних процессов обратно родительскому. КонструкцияОшибка структуры трубопроводов

typedef struct node* Node; 
struct node{ 
    char *str; 
    int num; 
    struct node* next; 
}; 

настроен как. Когда я читаю/пишу с помощью трубы и пытаюсь распечатать поля структуры, он говорит, что моя переменная запрашивает что-то из структуры, но не является структурой.

wordc-mp-main.c:123:44: error: request for member ‘num’ in something not a structure or union 
printf("%s, count %d\n", taken->str, taken->num); 
             ^

Вот код трубы от процессов ребенка:

close(fd[0]); 
fclose(inputFile); 
Node* pass = wordList->head; 
write(fd[1], pass, sizeof(Node)); 

Вот код из Родитель:

close(fd[1]); 
Node* taken; 
read(fd[0], taken, sizeof(Node)); 
printf("%s, count %d\n", taken->str, taken->num); 

Пожалуйста, помогите и спасибо.

обновления: убрано * из узлов и сделали один

Node taken = (Node) malloc(sizeof(Node)); 

Я не получаю ошибки сегментации, но моя структура не проходит через трубу правильно.

+2

И вот почему вы не скрываете свою косвенность через 'typedef's. – EOF

+0

Обратите внимание, что структура, содержащая 2 указателя, не является хорошим кандидатом для отправки между процессами. Указатель в процессе отправки, как правило, недействителен в процессе приема; вы не передали данные, на которые указывают указатели. Вероятно, это приведет к сбоям, если вы столкнулись с проблемами компиляции. –

+0

См. [Это хорошая идея для указателей typedef] (http://stackoverflow.com/questions/750178/is-it-a-good-idea-to-typedef-pointers) для подробного обсуждения @ EOF's точка. –

ответ

0

Node is typedef struct node* Node (т. Е. Node уже определено указателем). Таким образом, у вас есть дополнительный слой косвенности:

изменение:

Node *taken; 

Into:

Node taken; 
+0

Когда я это сделал, у меня возникла ошибка сегментации. –

+0

Вы получите ошибки сегментации, если вы передадите указатели на память, выделенные в дочернем процессе, и попытайтесь разыменовать их в родительском процессе. –

+0

@PaulGriffiths Да, это возможно [и я знал о таких возможностях]. Но вопрос OP касался ошибки компиляции. Он не опубликовал достаточно, чтобы сделать более глубокий анализ. Может быть, он увидит этот комментарий. –

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

  • Нет связанных вопросов^_^