я развернул следующий код C++ в системе Linux
int sendEMail ( string sEMailAddress, string sEMailSubject , string sEMailText )
{
int nRc = nOK;
// send email here
const int nBUFFERSIZE = 55000;
static char szCommand [ nBUFFERSIZE ] = { 0 };
const char * szEmailText = NULL;
FILE *fpipe = popen("sendmail -t", "w");
szEmailText=sEMailText.c_str();
if ( fpipe != NULL )
{
fprintf(fpipe, "To: %s\n", sEMailAddress.c_str());
fprintf(fpipe, "From: %s\n", "[email protected]");
fprintf(fpipe, "Subject: %s\n\n", sEMailSubject.c_str());
fwrite(sEMailText.c_str(), 1, strlen(sEMailText.c_str()), fpipe);
pclose(fpipe);
}
else
{
Logger_log ( 1 , "ERROR: Cannot create pipe to mailx" );
nRc = -1;
}
return nRc;
}
Этот код работает отлично. Я должен гарантировать, что sendmail должен быть найден в Системе. Потому что у меня проблема. Переменная PATH не была установлена правильно. Поэтому sendmail не удалось найти в системе. Не было сообщения об ошибке, которое я получил. Электронная почта, кажется, отправляет. Но это не так. Как я могу реализовать в Code (return или Error Code), что я получаю сообщение об ошибке, если Sendmail Process не удалось найти? Thanx заранее
Я не уверен, но я думаю, что из руководства есть несколько ответов:
1. popen calls/bin/sh -c <ваша команда>, поэтому я думаю, что popen всегда будет успешным, если /bin/sh не найден
2. вы должны проверить код возврата:
int ret_code=pclose(fpipe);
if (ret_code != 0)
{
// Error handling comes here
}
Из справочной страницы (man popen)
Функция pclose() ожидает завершения связанного процесса и возвращает статус выхода команды, возвращаемой wait4 (2).
...
Функция pclose() возвращает -1, если wait4 (2) возвращает ошибку или обнаруживается некоторая другая ошибка.
Один из способов (специально проверить для команды не найденную ошибку):
2(stderr)
является файловым дескриптором по умолчанию в системе linux.
перенаправить эту ошибку в файл errorfile. Теперь сравните содержимое файла ошибок, и если в содержимом есть command not found
строка, это гарантирует, что команда не будет найдена.
FILE* fpipe = popen("sendmail 2>errorfile", "w");
FILE* file = fopen("complete path to errorfile", "r");
char buf[124];
fgets(buf, 100, file);
printf("%s", buf);
if(strstr(buf, "command not found")!=NULL)
printf("Command not found");
Другой способ,
можно использовать system
функцию
#include <stdlib.h>
int i;
i = system("sendmail");
printf("The return value is %d", i);
Это возвращаемое значение может использоваться для проверки успешного выполнения команды. Возвращаемое значение зависит от вашего устройства, поэтому проверьте, что такое возвращаемое значение. Однако для успеха он обычно равен нулю.