2013-04-13 1 views
0

Я пытаюсь разблокировать дочерний элемент и написать ему структуру, но по какой-то причине запись не выполняется. Вот что я получил до сих пор:Написание структуры для дочернего сбойного канала

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int main(){ 
    pid_t pid; 
    int pfd[2]; 
    int rv; 
    if(pipe(pfd) == -1){ 
     printf("Pipe failed\n"); 
    } 

    struct t{ 
     int count[26]; 
     char array[4]; 
    }; 
    struct t st; 

    if((pid = fork()) < 0){ 
     printf("Fork error\n"); 
    }else if(pid == 0){ 
     close(pfd[1]); 
     rv = read(pfd[0],st,sizeof(struct t)); 
     printf("Read string: %d\n",rv); 
    }else{ 
     int i = 0; 
     for(i = 0; i < 26; i++){ 
      st.count[i] = i; 
     } 
     for(i = 0; i < 3; i++){ 
      st.array[i] = 'A'; 
     } 
     st.array[3] = '\0'; 

     close(pfd[0]); 
     rv = write(pfd[1],st,sizeof(struct t)); 
     printf("wrote: %d",rv); 
     close(pfd[1]); 
    } 
} 

Это убивало меня всю ночь. У меня есть подозрение, что это связано с тем, что я не полностью понимаю указатели на структуры. Я напечатал sizeof (struct t), который вернул 108 байтов (как и ожидалось), и я думал, что st был указателем на начало структуры, то есть команда записи начала бы там и записывать первые 108 байт, но, очевидно, это не так , Что мне не хватает?

+1

Вам необходимо передать адрес 'st'. Измените параметр команды write на '& st'. –

+0

Возвращаемое значение равно -1 при замене st на & st в команде записи –

+0

Этот код не компилируется. Вы не замечаете этого и запускаете какую-то старую версию своей программы? Я это сделал. 'Write (..., st, ...)' должен давать 'несовместимый тип для аргумента 2 'write'' –

ответ

1

Пробег: &st. st - это сама структура. & снимает указатель.

Возможно, вам необходимо включить (или прислушаться) предупреждения компилятора. Добавьте команду -Wall или -Wall -Wextra в команду компиляции.


Необходимо включить заголовочный файл для функции read.

Теперь вы должны получить сообщение об ошибке.

+0

Я пробовал & st безрезультатно. Этот код компилируется, поэтому я не уверен, какие предупреждения нужно возглавлять. –

+0

Обновлено. Добавьте все соответствующие файлы заголовков. –

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