2011-03-03 108 views
2

这是在unix中使用的pipe fork exec trio的简单演示。windows中的fork fork和execvp模拟器

#include <stdio.h> 
#include <sys/fcntl.h> 
#include <unistd.h> 
#include <sys/types.h> 

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; 
} 

现在我想写在使用WinAPI的窗口相同。我应该使用哪些功能?有任何想法吗?

回答

5

fork()execvp()在Windows中没有直接的等价物。 fork和exec的组合将映射到CreateProcess(如果使用MSVC,则为_spawnvp)。对于重定向,你需要CreatePipe和DuplicateHandle,这是体面覆盖this MSDN article

+0

what about: http://msdn.microsoft.com/en-us/library/3xw6zy53.aspx – Sebastian 2014-07-02 12:29:53

2

如果你只需要叉+ execvp在启动另一个进程从管道(在你的例子一样)读的意义,那么答案给出Erik是你想要的100%(+1)。

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

+0

+1 thanks @ dm.skt – 2011-03-03 15:22:08