C - 不同大小的文字

时间:2015-10-27 10:58:22

标签: c

我必须为我的任命编写一个由代理和中央服务器守护程序组成的程序。它将是一个分布式shell - 从服务器发出的每个命令也将在每个代理上执行(输出将从每个代理发送回中央服务器)。

我将不得不处理输出命令(如ls -la / home / user / dir1) - 在每个代理上输出的大小可能不同)。 “find /”的输出也将是BIG,但我必须考虑到这样的事情会发生。在C中处理不同大小的输出并对其进行操作的理想方法是什么? (保存到变量,通过套接字发送)。

2 个答案:

答案 0 :(得分:0)

处理任意大小数据的方法是使用动态分配,即函数malloc()realloc()free()。您可以分配并可能增加存储命令输出所需的内存。

读取命令输出(假设类似Unix的操作系统)最好用popen()完成。 有关详细信息,请阅读每个提到的功能的手册。

答案 1 :(得分:0)

动态内存分配

保持"可变长度"字符串,你应该使用动态内存分配: malloc family 的函数。

#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. 重要的是要注意您在重新分配时使用相同大小的块进行读取。 (您也可以阅读较小的块,但不要更大)。

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