2009-03-18 4 views

ответ

7

Будет popen работы? Он запускает процесс, затем вы читаете/записываете с помощью дескриптора FILE*

5

Тогда ваш выбор system(), или с помощью библиотеки, которая обертывает процесс нереста для вас. Последнее, или жесткий путь, который вы хотели избежать, рекомендуется, если требуется тонкий контроль над ошибками, трубами и т. Д.

3

system() достаточно просто.

Но вы должны стараться не делать этого, если можете. Скрипты работают лучше всего, когда они находятся поверх вещей, а не снизу. Если вы находитесь в UNIX, часто лучше разбить работу и написать сценарий верхнего уровня, чтобы называть все части.

Я помню, как программист добавлял огромное количество системных вызовов в свой код C, чтобы избежать необходимости изучать оболочку Bourne. Он полагал, что это был умный и быстрый способ добиться успеха, однако, когда он потерпел неудачу, он потерпел неудачу. Он потратил огромное количество времени на отладку беспорядка. Было бы проще ускорить изучение нескольких простых команд оболочки ...

Paul.

1

libc имеет функции system и popen, которые работают вроде как это:

int system(cont char *command) { 
    const char *argv[4] = {"/bin/sh", "-c", command}; 
    int status; 
    pid_t child = fork(); 
    if (child == 0) { 
     execve(argv[0], argv, NULL); 
     exit(-1); 
    } 
    waitpid(child, &status, 0); 
    return status; 
} 

FILE *popen(const char *command, const char *type) { 
    int fds[2]; 
    const char *argv[4] = {"/bin/sh", "-c", command}; 
    pipe(fds); 
    if (fork() == 0) { 
     close(fds[0]); 
     dup2(type[0] == 'r' ? 0 : 1, fds[1]); 
     close(fds[1]); 
     execve(argv[0], argv, NULL); 
     exit(-1); 
    } 
    close(fds[1]); 
    return fdopen(fds[0], type); 
} 

(за исключением дополнительной проверки ошибок и прочее)

Если вы хотите более точный контроль над аргументом обработки (вместо того, чтобы идти через sh), или вы хотите управлять более чем одним из {stdin, stdout, stderr}, вам придется написать его самостоятельно или найти библиотеку. Но стандартная библиотека охватывает большинство случаев использования.

1

Вы можете сделать это с помощью системы () называют Этот Thread является хорошим примером

Смежные вопросы