Как я могу вызвать awk или sed из программы c?

StackOverflow https://stackoverflow.com/questions/658653

  •  20-08-2019
  •  | 
  •  

Вопрос

Как я могу вызвать awk или sed внутри программы c?Я знаю, что мог бы использовать exec(), но я не хочу иметь дело с fork() и всей этой гадостью.

Это было полезно?

Решение

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

Другие советы

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

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

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

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

Павел.

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}, вам придется написать его самостоятельно или найти библиотеку. Но стандартная библиотека охватывает большинство случаев использования.

Вы можете сделать это с помощью вызова system () . Это Тема - хороший пример

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top