Данные, отправляемые в канал, буферизуются, поэтому вам не нужен другой буфер.Просто читайте данные из канала всякий раз, когда это необходимо.Вы можете проверить, есть ли данные для чтения, используя функцию poll
.Вам не нужен поток для чтения.
Также вам не нужен поток exec, потому что вы все равно fork
.
Кроме того, ваше приложение будет прервано почти сразу, потому что основной потокможет закончиться после запуска вторичных потоков.
Другая вещь, на которую следует обратить внимание, это то, что вы должны закрыть ненужные дескрипторы.pipe
открывает 2 дескриптора, fork
дублирует все открытые дескрипторы, dup2
дублирует дескриптор.Вы не закрыли ничего.
Если вы просто хотите прочитать вывод какого-либо процесса, запустите его, используя popen
.Ниже приведен короткий пример.
основное приложение:
int main()
{
FILE *f = popen("./test", "r"); // open the process
/* Your application is busy now, but the process runs and outputs */
sleep(5);
/* Now assume you need some data - just read it */
int c;
while (0 <= (c = fgetc(f))) putchar(c);
}
тестовое приложение:
int main()
{
int i;
for (i = 0; i < 10; i++) {
puts("Hello world!");
fflush(stdout);
sleep(1);
}
}
Если это решение не соответствует вашим потребностям, напишите, в чем проблема.