Как я могу вызвать awk или sed внутри c-программы? Я знаю, что могу использовать exec(), но я не хочу иметь дело с fork() и всей этой гадостью.Как я могу вызвать awk или sed изнутри c-программы?
ответ
Будет popen
работы? Он запускает процесс, затем вы читаете/записываете с помощью дескриптора FILE*
Тогда ваш выбор system()
, или с помощью библиотеки, которая обертывает процесс нереста для вас. Последнее, или жесткий путь, который вы хотели избежать, рекомендуется, если требуется тонкий контроль над ошибками, трубами и т. Д.
system() достаточно просто.
Но вы должны стараться не делать этого, если можете. Скрипты работают лучше всего, когда они находятся поверх вещей, а не снизу. Если вы находитесь в UNIX, часто лучше разбить работу и написать сценарий верхнего уровня, чтобы называть все части.
Я помню, как программист добавлял огромное количество системных вызовов в свой код C, чтобы избежать необходимости изучать оболочку Bourne. Он полагал, что это был умный и быстрый способ добиться успеха, однако, когда он потерпел неудачу, он потерпел неудачу. Он потратил огромное количество времени на отладку беспорядка. Было бы проще ускорить изучение нескольких простых команд оболочки ...
Paul.
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}
, вам придется написать его самостоятельно или найти библиотеку. Но стандартная библиотека охватывает большинство случаев использования.
Вы можете сделать это с помощью системы () называют Этот Thread является хорошим примером
- 1. трубопровод | awk или awk | sed
- 2. AWK или Sed, или вместе?
- 3. sed или awk multiline replace
- 4. Программирование в SED или AWK
- 5. Удалить цитаты awk или sed
- 6. программирование оболочки или SED/AWK
- 7. Как я могу вызвать ошибку изнутри gulp-esdoc?
- 8. Как я могу вызвать «Ошибка задачи» изнутри приложения консоли C#?
- 9. Как я могу вызвать ASHX изнутри функции ASPX.VB?
- 10. Уточнить Использование Awk или Sed с Curl
- 11. удалить столбец с awk или sed
- 12. READING stderr изнутри Awk
- 13. преобразовать команду pcregrep в awk или sed
- 14. sed или awk, заменяющий текст текстовым файлом
- 15. Linux CLI цена изменения (awk или sed?)
- 16. SED или AWK: изменить $ {xxxx} на '{xxxx}'
- 17. Использование awk или sed в Mac OS
- 18. удаление строк в sed или awk
- 19. Использование sed или awk для обновления строки
- 20. AWK или SED - удалить определенные строки
- 21. cidr-конвертер с помощью sed или awk
- 22. Строка Замена с использованием Sed или Awk
- 23. Удаление текста с помощью sed или awk
- 24. Сплит данных с помощью sed или awk
- 25. Использовать переменные в awk и/или sed
- 26. Как сделать такие замены с AWK или sed или Perl?
- 27. вопросы интервью по sed или awk
- 28. sed или awk для захвата части url
- 29. AWK или sed способ вставки несвязных линий
- 30. Sed или awk после последней толстой кишки?