繁体   English   中英

C - 不同大小的文本

[英]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);

    (...)
}
  • 请注意,此代码未经测试,只是您的一个想法。 错误检查被省略

    1. struct mem_block :这将保留有关当前内存块的信息。
    2. new_chunk :为您创建新块处理程序的函数。
    3. realloc_chunk :只要必须写入的字符数量超过块中可用的字符数量,我们就会多获得一个块。
    4. cat_ag_str :这会将您刚刚读取的内容附加到您拥有的内存块中,有效地将数据块转换为一个连贯的大缓冲区。
    5. receive_from_agent :这是您的接收循环的入口点。 您可以使用readrecv ,我不知道您使用的是哪个,但两者都返回读取的字节数,您将使用它传递给cat_ag_str
    6. 请务必注意,您正在读取与重新分配相同大小的块。 (你也可以读更小的块,但永远不会更大)。

您可以对发送进行大致相同的操作,但您不需要所有内存解决方法。 您可以只使用固定大小的缓冲区并以固定大小将数据从大字符串复制到它,然后发送固定大小的缓冲区。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM