【问题标题】:How to avoid space splitting and quote removal with _spawnvp()如何使用 _spawnvp() 避免空间分割和引号删除
【发布时间】:2010-11-10 17:04:48
【问题描述】:

在 Unix 上,我们可以使用 fork() 创建一个新进程; execvp(argv[0], argv); (如果我们是跟随叉子的父母或孩子,则需要进行一些管道工作)。在子进程中,main(argc, argv) 将看到与传递给 execvp 完全相同的字符串。

在 Windows 上,_spawn() 系列基本上实现了 fork();执行();一步。到目前为止,很好。问题是,当我们到达孩子的 main() 时,我们的字符串已经不是原来的样子了。我举个例子吧。

argv[0] = "foo";
argv[1] = "bar";
argv[2] = "Use spaces and \"quotes\"";
_spawnvp(0, argv[0], argv);

当我们到达子节点时,在 main() 中,我们会发现,在这个例子中,argv[0] 和 argv[1] 符合预期,但是 argv[2] 已经在空格上进行了标记,并且去掉了引号等那个

argv[2] == "Use"
argv[3] == "and"
argv[4] == "quotes"

如何将 argv 结构按原样从父级传递给子级,并对其进行重新解释和更改?

【问题讨论】:

  • 如果用单引号括起来会怎样? argv[2] = "'使用空格和\"引号\"'";
  • @Chris:这甚至不接近 C 语法。

标签: c windows


【解决方案1】:

根据MSDN 文档中的注释,如果您希望将包含空格的字符串作为单个参数传递,则需要将其引用。

字符串中嵌入的空格可能会导致意外行为;例如,传递 _spawn 字符串“hi there”将导致新进程获得两个参数,“hi”和“there”。如果目的是让新进程打开一个名为“hi there”的文件,则该进程将失败。您可以通过引用字符串来避免这种情况:"\"hi there\""。

【讨论】:

  • 这意味着我们必须在每个字符串周围加上引号(以停止空间分割)并反斜杠转义字符串中的任何引号。当然可行。我想知道是否有更优雅的东西。
猜你喜欢
  • 1970-01-01
  • 2016-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-03-18
  • 2017-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多