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

时间:2011-03-03 13:46:16

标签: c++ c winapi

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

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

现在我想在Windows中使用WinAPI编写相同内容。我应该使用哪些功能?有什么想法吗?

2 个答案:

答案 0 :(得分:5)

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

中得到了很好的体现。

答案 1 :(得分:2)

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

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