2010-11-10 82 views
3

在Unix上,我们可以使用fork()创建一个新进程; execvp(argv [0],argv); (如果我们是分岔后的父母或孩子,则需要一些管道工)。在子进程中,main(argc,argv)会在传递给execvp时看到字符串。在Windows上,_spawn()系列基本实现fork(); EXEC();一步到位。到目前为止,这么好。问题是,当我们到达孩子的main()时,我们的字符串不是他们的。让我举个例子。如何避免使用_spawnvp()删除空间拆分和报价

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的结构孩子,它被重新解释和改变?

+0

如果用单引号括起来会发生什么? argv [2] =“'使用空格和\”引号\“'”; – chrisaycock 2010-11-10 17:31:50

+1

@Chris:这甚至不接近C语法。 – Puppy 2010-11-10 18:06:33

回答

2

根据MSDN的文档说明,如果你想要一个包含空格的字符串作为单个参数传递,你需要引用它。

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

+0

这意味着我们必须在每个字符串周围加上引号(以停止空间分割)并且在字符串中加上反斜杠 - 转义任何引号。当然可以。我想知道是否有更优雅的东西。 – mealnor 2010-11-10 18:05:09