2013-03-15 1 views
0

Я разрабатываю приложение на C. Я пишу данные из одного процесса в другой с помощью трубы. Процессы удалены, а процесс-1 записывает переменные данные каждый раз. Процесс-1 пишет buf (char buf[4]) длины 4. В процессе-2 я прочитал эти данные. Враг, определяющий размер I, использовал вызов функции ioctl().Почему размер buf изменился на 1 из 4

while(read(to_child[0], &byte, 1) == 1)    // Read first byte as ioctl is not 
     {            //blocking and then allocate the           
       fprintf(fp,"\n Inside teh if block"); // buffer size = count+1;          
       ioctl(to_child[0], FIONREAD, &count);           
       buf = malloc(count+1);    // count is 3 here          
       buf[0] = byte;                
       read(to_child[0], buf+1, count);  // total length read is 4.          
     }           
    printf("count :%d, buf size: %d", count+1, strlen(buf)); 

Ioctl() функция считывает 4 байта в другой BUF в процессе-2() (Как exepected). Но после этого, когда я печатаю длина буфера с использованием STRLEN() он дает длину, как 1.

OUTPUT: 
count:4 buf size: 1 

Что происходит здесь не так? Я делаю неправильно с типами данных?

ответ

2

возвращает длину строк в стиле c, то есть массив символов с нулевым завершающим символом (и у них только один нулевой байт в конце). Если вы отправляете/получаете двоичные данные, он возвращает позицию первого байта «0». Если вы уже знаете размер двоичных данных, которые вам не нужно запрашивать, возможно, вам нужна структура с полями данных и длины.

В вашем случае вы можете просто сделать read(to_child[0], buf, 4) == 4, чтобы убедиться, что вы получаете 4 байта на чтение. Весьма бессмысленный пример:

typedef struct { char data[4]; int cnt; } Buffer; 
Buffer buf; 
while((buf.cnt = read(to_child[0], buf.data, 4)) == 4) { 
    fprintf(fp,"\n Inside teh if block"); 
    printf("buf size: %d", buf.cnt); 
}  
+0

Благодарим за ответ. Для двоичных данных, как бы получить общую длину буфера? –

+1

Вы не можете получить полную длину. Как я объяснил выше, вам нужно самому отслеживать это. – perreal

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