2011-03-03 140 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