我正在用C开发一个应用程序。我使用管道将数据从一个进程写入另一个进程。
进程是远程的,进程1每次都写入可变大小的数据。
进程-1写入长度为4的buf(char buf[4]
)。在进程-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()函数在process-2()中读取4个字节到另一个buf(如所预期的那样)。但是在此之后,当我使用strlen()打印缓冲区长度时,它将长度设为1。
OUTPUT:
count:4 buf size: 1
这里出了什么问题?我对变量的数据类型做错了吗?
答案 0 :(得分:2)
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);
}