Откройте программу cmd с полной функциональностью (i / o)

Я попробовал 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 ...)