У меня есть следующий код, чтобы найти выпуск дистрибутива Linux, который я использую.Предотвратить popen() от отображения ошибки на stderr
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
return print_osinfo();
}
int print_osinfo()
{
FILE *fp;
extern FILE* popen();
char buffer[128];
int index = 0;
memset(buffer,0,sizeof(buffer));
fp = popen("/etc/centos-release", "r");
if(!fp)
{
pclose(fp);
fp = popen("/etc/redhat-release", "r");
if(!fp)
{
pclose(fp);
return 1;
}
}
while(fgets(buffer, sizeof(buffer), fp)!= NULL)
{
printf("%s\n",buffer);
}
pclose(fp);
return 0;
}
Если я запустил вышеуказанный код на Ubuntu 14.04, то получаю следующее сообщение об ошибке.
sh: 1: /etc/centos-release: not found
Я не понимаю, почему он не пытается открыть redhat-release
, а затем вернуть -1. Кроме того, существует ли способ предотвратить отображение вышеуказанной ошибки на экране?
Возможно, перенаправляя 'stderr', как этот' popen ("/ etc/centos-release 2>/dev/null", "r") '? Или возможно 'popen ("/etc/centos-release 2> & 1 "," r ");' 'stderr' перенаправляется на' stdout' – Cyclonecode
Ни/etc/centos-release, ни/etc/redhat-release не являются исполняемыми файлами, поэтому вам не нужно использовать popen/pclose для их чтения - просто используйте fopen/fclose. Используйте popen/pclose для запуска чего-то вроде «uname -a», который испускает некоторую текстовую информацию о текущей системе. – sjnarv
Ошибки не записываются в stdout, как указывает заголовок вашего вопроса. Они записываются в stderr. –