progX & 2>/dev/null 1>/dev/null 0>/dev/null
stdin (0) является вводом. Не выводится. Запуск демона должен закрывать 0,1,2 - фактически все открытые дескрипторы файлов сразу после того, как он отключился от родительского процесса. Поэтому я не понимаю, почему вы хотите перенаправить сообщения об ошибках при запуске демона в /dev/null.
Что блокирует любые сообщения, которые вы можете получить от ProgX. Лучше всего просто запустить ProgX, как вы написали.
fprintf(stderr, "daemon error %s\n", strerror(errno));
может быть лучше - ошибки идут в stderr, вывод printf в stdout.