Я попробовал popen()
и он хорошо работает для вывода с "r"
переданным в качестве второго аргумента; Я знаю, что вы можете использовать "w"
качестве режима записи, и это сработало для меня (программа была всего лишь одним scanf()
). Мой вопрос заключается в том, как использовать режим append ( "a"
). Вы можете писать и читать, как вы знаете, когда программа выводит что-то и когда она запрашивает ввод пользователя?
popen использует трубу (это «p» в «popen»), а трубы однонаправлены. Вы можете читать или писать с одного конца трубы, а не на обоих. Чтобы получить доступ как для чтения, так и для записи, вы должны использовать socketpair. Я использую это в своих программах, когда мне нужно что-то вроде popen, но для чтения / записи:
#include #include #include #include FILE *sopen(const char *program) { int fds[2]; pid_t pid; if (socketpair(AF_UNIX, SOCK_STREAM, 0, fds) < 0) return NULL; switch(pid=vfork()) { case -1: /* Error */ close(fds[0]); close(fds[1]); return NULL; case 0: /* child */ close(fds[0]); dup2(fds[1], 0); dup2(fds[1], 1); close(fds[1]); execl("/bin/sh", "sh", "-c", program, NULL); _exit(127); } /* parent */ close(fds[1]); return fdopen(fds[0], "r+"); }
Обратите внимание, что, поскольку он не возвращает pid ребенка, после завершения дочерней программы у вас будет процесс aa zombie. (Если вы не настроили SIGCHLD ...)