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