我在Linux系统上部署了以下C ++代码
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", "test@mail.de");
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;
}
本规范正常。我必须确保在System上找到sendmail。因为我遇到了问题。 PATH变量设置不正确。因此无法在System上找到sendmail。没有错误消息,我收到了。电子邮件似乎发送出去了。但事实并非如此。如果找不到Sendmail进程,如何在代码(返回或错误代码)中实现我收到错误消息? Thanx in Advance
答案 0 :(得分:0)
单向(专门检查命令未找到错误):
2(stderr)
是linux系统上的默认文件描述符。
将此错误重定向到文件 errorfile 。现在比较 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);
此返回值可用于检查命令是否成功执行。返回值是您的机器依赖的,所以检查返回值是什么。然而,成功通常为零。
答案 1 :(得分:0)
我不确定,但我认为从手册中有一些答案:
1. popen calls / bin / sh -c&lt; your command&gt;所以我猜popen会一直成功,除非找不到/ bin / sh
2.你应该检查返回码:
int ret_code=pclose(fpipe);
if (ret_code != 0)
{
// Error handling comes here
}
来自手册页(man popen)
pclose()函数等待关联的进程终止并返回wait4(2)返回的命令的退出状态。
...
如果wait4(2)返回错误,或者检测到其他错误,则pclose()函数返回-1。