2010-11-10 58 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