Windows中的管道分支和execvp类似物

这是在unix中使用的pipe fork exec三重奏的简单演示。

#include  #include  #include  #include  int main() { int outfd[2]; if(pipe(outfd)!=0) { exit(1); } pid_t pid = fork(); if(pid == 0) { //child close(outfd[0]); dup2(outfd[1], fileno(stdout)); char *argv[]={"ls",NULL}; execvp(argv[0], (char *const *)argv); throw; } if(pid < 0) { exit(1); } else { //parrent close(outfd[1]); dup2(outfd[0], fileno(stdin)); FILE *fin = fdopen(outfd[0], "rt"); char *buffer[2500]; while(fgets(buffer, 2500, fin)!=0) { //do something with buffer } } return 0; } 

现在我想在Windows中使用WinAPI编写相同的内容。 我应该使用哪些function? 有任何想法吗?

fork()execvp()在Windows中没有直接的等价物。 fork和exec的组合将映射到CreateProcess(如果使用MSVC,则为_spawnvp)。 对于重定向,您需要CreatePipe和DuplicateHandle,这在MSDN文章中有所体现

如果你只需要fork + execvp来启动另一个从管道中读取的进程(比如你的例子),那么Erik给出的答案是你想要的100%(+1就是这个)。

否则,如果你需要真正的 fork行为,你在Windows下没有运气,因为没有这样的东西。 虽然,有很多黑客可以实现,有点。 Cygwin有一个工作fork实现,它创建一个挂起的进程并滥用setjmp和共享内存来获取其上下文并手动复制堆栈并在父和子之间的某种复杂的“舞蹈”中堆积。 它远非漂亮而且效率不高,但它有点工作,它可能在它本身不支持它的操作系统下可以得到它。