Я разрабатываю программу, которая выполняет программу с помощью execvp. Он должен фиксировать результаты дочернего процесса и анализировать их в основном процессе. Кажется, есть способ, используя именованные каналы, и обманывать. Я пытаюсь выследить хороший пример этого, но пока не повезло. Если у кого есть какие-то указатели, ссылки и/или предложения об этом, я бы очень признателен.Как захватить вывод execvp
ответ
Вам не нужны именованные трубы; неназванные трубы работают нормально. Собственно, часто вы можете просто использовать popen
вместо того, чтобы делать pipe
/fork
/dup
/exec
самостоятельно. popen
как это работает (хотя реализация ваших libc
«ы, вероятно, имеет больше проверки ошибок):
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]);
execvp(argv[0], argv);
exit(-1);
}
close(fds[1]);
return fdopen(fds[0], type);
}
Это создает безымянную трубку и fork
с. В ребенке он привязывает stdout (или stdin) к одному концу трубы, затем exec
s ребенок. Родитель может просто читать (или писать) с другого конца трубы.
Великого. Я рассмотрел, как работают трубы, и это должно сделать трюк. –
Просто для записи, если кто-то спотыкается об этом. Условие, основанное на типе [0], не совсем корректно. Нужно закрыть stdout/stdin перед dup2, чтобы это было возможно. Кроме того, труба является однонаправленной, а fds [1] является концом записи, поэтому для чтения следует использовать fds [0] в dup2. –
Не можете ли вы использовать popen()?
Вот простой пример, демонстрирующий использование popen для достижения вашей цели. Просто поместите что-то более интересное, чем «эхо», как команда :)
#include <stdio.h>
int main()
{
char buf[100];
int i = 0;
FILE *p = popen("echo \"Test\"","r");
if (p != NULL)
{
while (!feof(p) && (i < 99))
{
fread(&buf[i++],1,1,p);
}
buf[i] = 0;
printf("%s",buf);
pclose(p);
return 0;
}
else
{
return -1;
}
}
- 1. Как захватить вывод функции execvp() в c?
- 2. Как сохранить вывод execvp
- 3. execvp вилка: ждать стандартный вывод
- 4. как захватить вывод «mount»
- 5. Как захватить вывод printf?
- 6. Powershell: Как захватить вывод powershell
- 7. Как захватить вывод нескольких команд?
- 8. Как захватить вывод в Java
- 9. Как захватить RCurl подробный вывод
- 10. перенаправлять вывод execvp в файл в C
- 11. Как захватить вывод экрана запущенной программы?
- 12. Как захватить вывод exec-maven-plugin?
- 13. как захватить вывод «sort -c» в linux
- 14. Как захватить вывод log4net в xunit2
- 15. как захватить вывод трассировки приложения flex?
- 16. Как захватить вывод DML в teradata?
- 17. Powershell: как захватить вывод с хоста
- 18. Как выполнить внешнюю команду и захватить вывод?
- 19. Как захватить вывод консоли на языке R?
- 20. Как захватить вывод с помощью библиотеки syslog
- 21. Perl: Как захватить вывод WMIC в переменную
- 22. как правильно захватить все стандартный вывод/STDERR
- 23. Как захватить весь вывод Bash в Java
- 24. Как захватить вывод strace в C++-программе
- 25. Как захватить многострочный вывод вспомогательной функции?
- 26. Как захватить вывод chown в сценарии ksh
- 27. Как захватить вывод консоли из службы C#?
- 28. Как захватить вывод PHP в переменную
- 29. Как захватить вывод эхо-сигнала на proc
- 30. Как использовать execvp()
Связанные: [получить вывод команды в трубе, C для Linux] (http://stackoverflow.com/questions/219138/) – ephemient