gpt4 book ai didi

c - 为什么buf的大小从4变成了1

转载 作者:行者123 更新时间:2023-11-30 14:20:29 25 4
gpt4 key购买 nike

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

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 个字节读取到 process-2() 处的另一个 buf 中(如预期)。但此后,当我使用 strlen() 打印缓冲区的长度时,它给出的长度为 1。

OUTPUT:
count:4 buf size: 1

这里出了什么问题?我对变量的数据类型做错了吗?

最佳答案

strlen 返回 c 风格字符串的长度,即一个以 null 结尾的字符数组(它们末尾只有一个空字节)。如果您正在发送/接收二进制数据,它将返回第一个“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);
}

关于c - 为什么buf的大小从4变成了1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15424342/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com