У меня есть программа, где мне нужно общаться с другой программой на ее стандартном вводе и выводе. Я могу использовать канал для отправки его ввода и перенаправления его вывода в указанный файл, который должен быть прочитан, когда это будет сделано, и это работает нормально. Я не использую pipe и dup2, потому что мне бы хотелось, чтобы моя программа хоть как-то работала как на окнах, так и на linux.popen не работает как ожидалось
Моя проблема заключается в том, что я хочу использовать трубы для передачи данных.
Я попробовал следующий фрагмент:
#include <stdio.h>
int main()
{
while (!feof(stdin)) {
int x;
scanf("%d", &x);
printf("%x ", x);
fflush(0);
}
return 0;
}
в сочетании с:
#include <unistd.h>
#include <stdio.h>
int main()
{
int x;
FILE *p = popen("./test > tmp.datafile", "w");
FILE *f = fopen("tmp.datafile", "r");
for (int i = 0; i < 100; ++i) {
fprintf(p, "%d", i);
sleep(1);
x = fgetc(f);
printf("%c ", x);
fflush(0);
}
fclose(f);
pclose(p);
return 0;
}
Однако независимо от того, что я делаю, я просто продолжаю получать аннулирует из файла. Я подозреваю, что, возможно, есть проблемы параллелизма, в том, что я пытаюсь прочитать файл до того, как тестовый исполняемый файл завершит его очистку, однако я не знаю, как это исправить.
Есть ли лучший способ общения с программой через стандартные потоки в c?
На самом деле, вы должны использовать [опрос (2)] (http://man7.org/linux/man-pages/man2/poll.2.html) в некоторых [цикл обработки событий] (https://en.wikipedia.org/wiki/Event_loop). Прочтите http://advancedlinuxprogramming.com/ и [this] (http://stackoverflow.com/a/20582916/841108) ответ. –
Я не думал о опросе файла, что тоже сработает. Вы знаете, как подобный опрос окон для Linux? Я знаю, что окно popen почти идентично, но не уверен в опросе. – LambdaBeta
Я вообще не знаю Windows, но некоторые библиотеки, такие как [POCO] (http://pocoproject.org/) или [Qt] (http://qt.io/) или [GLIB] (https: // developer.gnome.org/glib/stable/) (или, возможно, [libevent] (http://libevent.org/) ....) должны помогать и быть кросс-платформенными. Возможно, вам понадобятся [named pipes] (https: //en.wikipedia.org/wiki/Named_pipe) –