2011-03-03 4 views
2

이것은 유닉스에서 사용하는 pipe fork exec trio의 간단한 데모입니다.파이프 포크와 execvp analogs 윈도우에서

#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

약 : http://msdn.microsoft.com/en-us/library/3xw6zy53.aspx – Sebastian

2

입니다. 파이프에서 읽는 다른 프로세스 (예를 들어)를 시작한다는 의미에서 fork + execvp 만 필요한 경우 에릭은 당신이 원하는 100 %입니다 (+1).

그렇지 않으면 포크 동작이 필요한 경우 Windows가 작동하지 않아도됩니다. 그런 것은 없습니다. 비록 많은 해킹이 이루어지면 달성 될 수 있습니다. Cygwin은 일시 중단 된 프로세스를 생성하고 setjmp와 공유 메모리를 남용하여 컨텍스트를 유지하고 부모와 자식간에 다소 복잡한 "춤"으로 스택과 힙을 수동으로 복사하는 작업 포크 구현이 있습니다. 그것은 꽤 효율적이지 않고 지나치게 효율적이지는 않지만 일종의 작품이며, 기본적으로 지원하지 않는 운영체제에서 얻을 수있는 것만 큼 좋을 것입니다.

+0

+1 thanks @ dm.skt –

관련 문제