为什么buf的大小从4更改为1

问题描述:

我正在用C开发应用程序。我使用管道将数据从一个进程写入另一个进程。 进程是远程进程,进程1每次都写入可变大小的数据。 进程1写入长度为4的buf(char buf[4])。在进程2中,我读取了这些数据。确定我使用ioctl()函数调用的大小的敌人。为什么buf的大小从4更改为1

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()函数在进程2()(正如所期望的)处读取4个字节到另一个buf中。但在此之后,当我打印缓冲区的长度使用strlen的(),它给人的长度为1

OUTPUT: 
count:4 buf size: 1 

去什么错在这里?我做错了数据类型的变量?

strlen返回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

感谢您的回答。对于二进制数据,我将如何获得缓冲区的总长度? – 2013-03-15 03:54:11

+1

你不能真正得到总长度。正如我上面所解释的,你需要自己跟踪它。 – perreal 2013-03-15 03:55:31