gpt4 book ai didi

c - 二进制环境变量和 setenv()

转载 作者:太空狗 更新时间:2023-10-29 11:05:01 28 4
gpt4 key购买 nike

在 Linux 中使用二进制环境变量时,我发现了一些奇怪的行为,似乎某些单个字节是错误的。我仔细检查了一下,似乎某些字节在提供给 setenv() 时总是会被错误地“转换”。看看这个:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
char array[256];

int i;
for(i = 1; i < 256; i++) {
array[i] = i;
}

setenv("badenv", array, 1);

system("/bin/sh");

return 0;
}

我执行这个程序,然后当我执行 echo $badenv > test;我看到的 hexdump 测试:

0000000 0101 0302 0504 0706 2008 0c0b 0e0d 100f
0000010 1211 1413 1615 1817 1a19 1c1b 1e1d 201f
0000020 2221 2423 2625 2827 2a29 2c2b 2e2d 302f
0000030 3231 3433 3635 3837 3a39 3c3b 3e3d 403f

似乎0x9被转换为0x20,0xa被转换为0xb等等。

我是在滥用 setenv(),还是在滥用环境变量?我查看了联机帮助页并搜索了一些内容以查看环境变量是否应该能够处理二进制值,但我不确定。

这种行为的原因是什么,是否有任何解决方法,同时仍然使用环境变量?

最佳答案

根据 $IFS 的值将环境变量拆分为“单词”,并且“单词”由单个分隔符连接 - 在本例中为普通空格。因此序列 "\x09\x0a""\t\n", 被压缩为一个空格 ('\x20')在解释 array 的内容时。

IFS - The Internal Field Separator that is used for word splitting after expansion and to split lines into words with the read builtin command. The default value is ''space tab newline''.

您可以通过(临时)更改 $IFS 来避免替换。

但是请注意

  • array[0] 具有不确定的值
  • array 不是以 0 结尾的

在你的程序中。你应该解决这个问题。

关于c - 二进制环境变量和 setenv(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15767114/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com