C语言 如何有效地从文件中读取环境参数,以便与exec一起使用



我希望能够保存进程的argv和环境,而不是以后能够forkexec使用保存到文件的参数。

我能想到的唯一设计是将参数列表写入为长字符串,但是我需要将其从字符串转换为字符串数组,这是可能的,但非常麻烦。

谁能想到更好的方法?

我对文件格式的建议

  • 第一行是十进制数 N,等于 argc
  • 接下来的 N 行是argv字符串,每行一个字符串
  • 然后还有另一个十进制数 M,它等于环境字符串的数量
  • 接下来的 M 行是环境字符串,每行一个字符串

将文件读回内存

  • getline读取第一行,用sscanf转换数字
  • malloc N+1 指针数组
  • 使用 getline 读取接下来的 N 行,将指针存储在 argv 数组中
  • argv 数组的末尾放置一个 NULL 指针
  • getline阅读下一行,用sscanf转换数字
  • malloc M+1 指针数组
  • 使用 getline 读取接下来的 M 行,将指针存储在 env 数组中
  • env 数组的末尾放置一个 NULL 指针

使用时要记住两件事 getline .首先,它会自动malloc字符串的内存。其次,它将换行符放在字符串的末尾,因此您必须将其删除。

使用 getline 读取argv字符串的示例代码

int N = 5;
char **argv = malloc( (N + 1) * sizeof(char *) );
char *line;
size_t linecap, length;
for ( int i = 0; i < N; i++ )
{
    line = NULL;            // request that getline allocate memory
    linecap = 0;
    if ( (length = getline( &line, &linecap, fp )) <= 0 )
        exit( 1 );          // file ended prematurely
    line[length-1] = '';  // get rid of the pesky newline
    argv[i] = line;
}
argv[N] = NULL;

我解决这个问题的方法是编写具有以下结构的二进制文件:

begin file header:
  0x00 :: 0x03 [  4 bytes] number of entries
for each entry n at offset 0x04 + n * 4:
  0x00 :: 0x03 [  4 bytes] string length of entry (including terminating )
end file header

在标头之后,将所有条目作为字符串写入文件,包括终止字节。

要读取此文件,我将使用 fopenfreadfclose 从文件中读取偏移量数组,然后mmap该文件,并将偏移量数组转换为指向 mmap 区域的指针数组。

便携性说明:

如果您希望能够在一个体系结构上读取文件并在另一个体系结构上读取它,则需要

  • 确保使用固定宽度的数据类型(例如 uint32_tuint64_t (
  • 确定字节顺序以避免字节序问题。

所以,比如说,如果你想将uint32_t写入文件,没有字节序问题,你可以使用

void
write_uint32 (FILE *f, uint32_t v)
{
  unsigned char out[4] = { 0 };
  out[0] = v & 0xff; v >>= 8;
  out[1] = v & 0xff; v >>= 8;
  out[2] = v & 0xff; v >>= 8;
  out[3] = v
  fwrite(out, 1, sizeof(out), f);
}

并读取相同的值

uint32_t
read_uint32 (FILE *f)
{
  unsigned char in[4] = { 0 }
  fread(in, 1, sizeof(in), f);
  return in[3] << 24 | in[2] << 16 | in[1] << 8 | in[0];
}

最新更新