【问题标题】:What if there's '\0' character in command line input?如果命令行输入中有 '\0' 字符怎么办?
【发布时间】:2011-07-03 02:38:29
【问题描述】:
int main(int argc,char* argv[]);

如果A 中有'\0' 字符,它会被拆分成2 个参数吗?

./programe "A"

我无法轻松复制它,因为我无法将 '\0' 放入 A,但可能有人可以。

【问题讨论】:

  • 你不能? ./programe $'A\0B'
  • 这是出于安全考虑吗?
  • @Ignacio Vazquez-Abrams,$'A\0B' 在这里如何工作?
  • bash 解释 $'...' 中的转义序列。
  • 它没有 - 或者它有但它没有。我有一个程序al,它每行打印一个参数(而不是像echo 这样在一行上用空格分隔)。在 Bash 中,al $'a\0b' 仅生成 a 作为输出。您必须在 Bash 手册中查看 $'...' 的确切含义,就像我一样。我发现al "a\0b" 产生了a\0b 作为输出,这并不令我大吃一惊。因此,即使$'a\0b' notation includes a null in the string, the execve()` 系统调用在第一个 null 处停止复制参数,努力工作也没有任何用处。

标签: c command-line-interface


【解决方案1】:

参数作为C字符串传递给程序;特别是,execve() 系统调用(程序可见的最低级别,通常与内核 API 非常接近或相同)使用 C 字符串,因此不可能在参数中传递\0。请注意,虽然内核将参数向量传递到进程地址空间的通常方式是连续的,因此嵌入式\0 确实会拆分参数,但低级exec() 接口使用(char *) 的列表s,因此嵌入的\0 会简单地提前终止参数。

【讨论】:

  • main 看来的所有字符串无论如何都是以空值结尾的。无法传递“\0”,因为无法从正常情况中识别这种情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-01
  • 1970-01-01
  • 2015-06-09
  • 1970-01-01
  • 2023-03-09
相关资源
最近更新 更多