Выполнение команды оболочки и чтение ее вывода на C-программе - PullRequest
4 голосов
/ 12 марта 2011

Я пытаюсь создать функцию, которая принимает команду оболочки в качестве аргумента, использует fork для запуска нового процесса, который выполняет команду. Я также хочу перенаправить стандартный вывод команды, чтобы вызывающая функция могла прочитать ее, используя указатель FILE *.

static FILE* runCommand(char* command){
    int pfd[2];

    if(pipe(pfd)<0)     
        return NULL;

    if(pid=fork()==0){ //child
        close(pfd[0]);
        dup2(pfd[1],1); //redirect output to pipe for writing

        execlp(command,(char*)0);
    }

    close(pfd[1]);

    //return a file pointer/descriptor here?

}

Я не уверен, как вернуть указатель файла, который можно использовать для чтения вывода команды. Также это правильный способ выполнить команду на оболочке?

пс. Я читал о popen, но есть веская причина, по которой я не могу его использовать, поэтому я должен сам реализовать эту функцию.

Спасибо

Ответы [ 2 ]

4 голосов
/ 12 марта 2011

Одна ошибка в этом коде заключается в том, что вы присваиваете переменную pid, которая нигде не объявлена.И pid всегда будет 1 в родительском, потому что написанный код эквивалентен pid=(fork()==0), а не (pid=fork())==0.

. Вы также должны закрыть pfd [1] после вызова dup2.И для правильной меры, проверьте на наличие ошибок в dup2 и execlp.

Ответом на ваш реальный вопрос является использование fdopen.

1 голос
/ 12 марта 2011

Используйте fdopen, чтобы связать существующий дескриптор файла с объектом FILE *. Все остальное выглядит довольно хорошо.

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