труба вилка и execvp аналоги в windows - PullRequest
2 голосов
/ 03 марта 2011

Это простая демонстрация использования pipe fork exec trio в unix.

#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 ]

5 голосов
/ 03 марта 2011

fork() и execvp() не имеют прямого эквивалента в Windows.Комбинация fork и exec будет отображаться в CreateProcess (или _spawnvp, если вы используете MSVC).Для перенаправления вам нужны CreatePipe и DuplicateHandle, это прилично рассмотрено в этой статье MSDN

2 голосов
/ 03 марта 2011

Если вам нужен только fork + execvp в смысле запуска другого процесса, который читает из канала (как в вашем примере), то ответ, данный Эриком, на 100% соответствует вашему желанию (+1 на этом).

В противном случае, если вам нужно поведение real fork, вам не повезло под Windows, поскольку такой вещи не существует. Хотя, с помощью множества хаков, это может быть достигнуто, вроде. Cygwin имеет рабочую реализацию форка, которая создает приостановленный процесс и использует setjmp и разделяемую память, чтобы овладеть его контекстом и вручную скопировать стек и выполнить кучу в несколько сложном «танце» между родителем и потомком. Это далеко не красиво и не слишком эффективно, но это отчасти работает, и, вероятно, настолько же хорошо, насколько это возможно для операционной системы, которая изначально не поддерживает его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...