我希望能够保存进程的argv和环境,而不是以后能够fork
和exec
使用保存到文件的参数。
我能想到的唯一设计是将参数列表写入为长字符串,但是我需要将其从字符串转换为字符串数组,这是可能的,但非常麻烦。
谁能想到更好的方法?
我对文件格式的建议
- 第一行是十进制数 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
在标头之后,将所有条目作为字符串写入文件,包括终止