2011-04-21 12 views
2

在windows API创建过程中我们有CreateProcess函数。为什么同样的作品在windows上并不适用于unix?

现在让我们考虑我们想要创建进程并运行DIR /X命令。当然,在Windows中不存在可执行文件DIR.exe,我们不能将它传递给CreateProcess。那么该怎么办?

解决这个问题很简单。我们只需要通过cmd /C "DIR /X"(作为第二个参数)到CreateProcess

现在让我们尝试在unix中执行相同的操作(不是DIR /X,而是ls | wc)。

在unix中,我将使用fork + execvp来创建新进程并执行该命令。为什么我想要我的命令是ls | wc,因为在unix中,单个命令(如lsgrep,ps)是可执行文件,可以单独传递给exec(即不作为参数sh,bash,...)。

因此,我们似乎可以通过"ls | wc"作为sh的参数。 (即,我们可以标记sh -c "ls | wc"并将它们传递给execvp)。但是Oooops,这不起作用!

char *arg[] = {"sh", "-c", "\"ls | wc\"", NULL}; 
execvp(arg[0], arg); 

所以问题。我该如何解决这个问题?

P.S. 在Windows中如果安装了cygwin cmd /C "ls | wc"的作品。

+0

避免编辑您的问题,使现有的答案是这样的错误。事实之后,它会造成一个令人困惑的阅读。当然,不要编辑现有的答案来匹配修改后的问题。 – 2011-04-21 14:05:51

回答

1

得到的参数去掉引号来SH:

char *arg[] = {"sh", "-c", "ls | wc", NULL}; 
execvp(arg[0], arg); 
+0

没有区别。这没有帮助。我也试过这个变种'char * arg [] = {“sh”,“-c”,“ls”,“|”,“wc”};'但结果相同。 – 2011-04-21 12:48:38

+0

我跑这个,它的工作... – 2011-04-21 12:49:16

+0

http://ideone.com/fRdK7 – 2011-04-21 12:51:08

2

你不需要逃脱\",这应该只是罚款:

char *arg[] = {"sh", "-c", "ls | wc", NULL}; 

"仅仅是为shell将输入“group”的哪一部分区分为参数,但在拨打execvp时不需要它们。你的可能的效果就好像你在你的shell中输入了"ls | wc",包括双引号(试试吧,你会得到ls | wc: command not found)。

+0

加上缺少的NULL终止,正如@Mike Pulaski在他的回答中指出的那样。 – DarkDust 2011-04-21 12:50:18

5

您的参数列表必须以NULL指针终止。

char *arg[] = {"sh", "-c", "ls | wc", NULL}; 
2

在你的例子中,它可能会更容易使用system()。

相关问题