Ответ 1
popen
дает вам дескриптор файла в процессе 'stdout, а не в stderr. Его первый аргумент интерпретируется как команда оболочки, поэтому вы можете перенаправлять его:
FILE *p = popen("prog 2>&1", "r");
или, если вы вообще не хотите выпустить stdout,
FILE *p = popen("prog 2>&1 >/dev/null", "r");
(Любой другой файл, кроме /dev/null
является приемлемым.)