首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么buf的大小从4更改为1

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

Stack Overflow用户
提问于 2013-03-15 11:48:43
回答 1查看 78关注 0票数 0

我正在用C语言开发一个应用程序,我使用管道将数据从一个进程写到另一个进程。进程是远程的,并且process-1每次写入可变大小的数据。process-1写入长度为4的buf (char buf[4])。在process-2中,我读取该数据。为了确定大小,我使用了ioctl()函数调用。

代码语言:javascript
复制
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()函数在process-2()将4个字节读入另一个buf ()(如exepected所示)。但是之后,当我使用strlen()输出buffer的长度时,它给出的长度是1。

代码语言:javascript
复制
OUTPUT:
count:4 buf size: 1

这里出了什么问题?我是不是在变量的数据类型上做错了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-15 11:51:38

strlen返回c样式字符串的长度,即以null结尾的字符数组(它们的末尾只有一个空字节)。如果你正在发送/接收二进制数据,它将返回第一个'0‘字节的位置。如果您已经知道二进制数据的大小,则不需要查询它,也许您需要一个包含数据和长度字段的结构。

在您的情况下,您可以只执行read(to_child[0], buf, 4) == 4,以确保每次读取时都会收到4个字节。一个非常无意义的例子:

代码语言:javascript
复制
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);
}       
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15424342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档