c - 如何有效地从文件中读取环境参数,与 exec 一起使用

标签 c linux environment-variables exec command-line-arguments

我希望能够将进程的 argv 和 environ 保存到文件中,并且稍后能够 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] = '\0';  // get rid of the pesky newline
    argv[i] = line;
}

argv[N] = NULL;

关于c - 如何有效地从文件中读取环境参数,与 exec 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27578653/

相关文章:

c - C中三位数精度的快速舍入 float

c - 为什么第一个 gets() 函数不起作用?

linux - 一种在 protected 环境 (x86-64) 中运行汇编代码的方法

linux - 如何在不安装 perlbrew 的情况下指定用于脚本的 perl 版本

unix - 向 MobaXterm 添加环境变量的最佳方法

database - Rails 无法正确读取 database.yml 中的环境变量

c - 匹配(搜索)C 列表中的 URL 的最佳方法(实现白名单或黑名单)?

将数组中的元素 i 复制到另一个数组

linux - 从 bash 脚本调用时,Sed 命令无法正确执行,从提示符调用时工作正常

java - 如何在 Windows 8.1 安装上配置 Apache Tomcat?