[英]C - varying size text
我必须为我的作业编写一个程序,该程序将由代理和中央服务器守护程序组成。 它将是一个分布式 shell - 从服务器发出的每个命令也将在每个代理上执行(输出将从每个代理发送回中央服务器)。
我将不得不处理输出命令(如 ls -la /home/user/dir1) - 在每个代理上,输出的大小可能不同)。 “find /”的输出也会很大,但我必须以某种方式考虑到可能会发生这样的事情。 在 C 中处理不同大小的输出并对其进行操作的理想方法是什么? (保存到变量,通过套接字发送)。
处理任意大小数据的方法是使用动态分配,即函数malloc()
、 realloc()
和free()
。 您分配并可能增加存储命令输出所需的内存。
读取命令输出(假设是类 Unix 操作系统)最好使用popen()
。 有关详细信息,请阅读上述每个功能的手册。
要保存“可变长度”字符串,您应该使用动态内存分配: malloc 系列函数。
#include <stdlib.h>
void *malloc(size_t size);
void free(void *ptr);
void *calloc(size_t nmemb, size_t size);
void *realloc(void *ptr, size_t size);
因此,假设您将数据存储在变量char *ag_str
。 我建议你malloc
,然后realloc
块缓冲区的大小。 调用malloc
,然后realloc
一千倍,以调整块大小后的每个字符是非常昂贵的。
所以,你可能会做这样的事情:
#define BLOCK_SIZE 4096
struct mem_block {
size_t current_block_size;
size_t current_str_size;
char *ag_str;
};
struct mem_block *new_chunk(void)
{
struct mem_block *p = malloc(sizeof *p);
p->ag_str = malloc(BLOCK_SIZE);
p->current_block_size = BLOCK_SIZE;
p->current_str_size = 0;
return p;
}
void realloc_chunk(struct mem_block *chunk)
{
size_t ns = chunk->current_block_size + BLOCK_SIZE;
chunk->ag_str = realloc(chunk->ag_str, ns);
chunk->current_block_size = ns;
}
void cat_ag_str(struct mem_block *chunk, char *ag_str, size_t ag_len)
{
if (chunk->current_str_size + ag_len > chunk->current_block_size)
realloc_chunk(chunk);
strncat (chunk->ag_str, ag_str, ag_len);
chunk->current_str_size += ag_len;
}
void receive_from_agent(...)
{
struct mem_block *chunk = new_chunk();
ssize_t c; // Linux read/recv return
size_t count;
char buff[BLOCK_SIZE];
while((c = read(your_fd, buff, BLOCK_SIZE)) // or probably recv()
if (c < 0) ...
count = (size_t)c;
cat_ag_str(chunk, buff, count);
(...)
}
请注意,此代码未经测试,只是您的一个想法。 (错误检查被省略)
struct mem_block
:这将保留有关当前内存块的信息。new_chunk
:为您创建新块处理程序的函数。realloc_chunk
:只要必须写入的字符数量超过块中可用的字符数量,我们就会多获得一个块。cat_ag_str
:这会将您刚刚读取的内容附加到您拥有的内存块中,有效地将数据块转换为一个连贯的大缓冲区。receive_from_agent
:这是您的接收循环的入口点。 您可以使用read
或recv
,我不知道您使用的是哪个,但两者都返回读取的字节数,您将使用它传递给cat_ag_str
。您可以对发送进行大致相同的操作,但您不需要所有内存解决方法。 您可以只使用固定大小的缓冲区并以固定大小将数据从大字符串复制到它,然后发送固定大小的缓冲区。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.