【发布时间】:2016-12-31 07:32:24
【问题描述】:
我的 C 代码有问题,基本上我需要通过 mutt 程序发送电子邮件。它必须在 GPIO 引脚出现中断时发送。下面列出了我的 sendMail 功能。我通过使用 system 函数实现了这一点。 Main 包含带有包含 sendMail 的 logAlarm 函数的循环。问题是当 system(cmd) 函数完成时,整个 C 程序停止。例如,当我将 sendMail 函数放在 main 的开头时,它可以工作并且正在向我的邮箱发送电子邮件而不停止整个程序,在循环中它设法发送它但它终止了程序。我尝试使用 & 符号在后台运行它,但没有帮助。
PS 我不知道这是否重要,但我也使用来自 setitimer 的系统调用以 2 秒的间隔检查一些事情,但我想这对这种情况没有影响。
有什么想法吗?
提前致谢:)
发送邮件功能:
void sendMail(char * msg, char * recipientMail){
char cmd[100];
char subject[30];
char body[60];
sprintf(body, "Intruder detected!!!\n%s", msg);
strcpy(subject, "\"ALARM - SECURITY BREACH\"");
sprintf(cmd,"echo \"%s\" | mutt -s %s %s &", body, subject, recipientMail);
printf("%s\n\n", cmd);
system(cmd);
}
这是我的主要功能的一部分:
while(1){
sleep(1);
if(prev_state == triggered && !emailDetach){
if(!logAlarm()){
printf("Error writing to log file!!!\n");
}
emailDetach = true;
}
//printf("Czas od poprzedniego alarmu: %d", millis() - alarmTriggeredTime);
if((prev_state == triggered) && (millis() - alarmTriggeredTime >= ALARM_TIME)){
digitalWrite(ALARM_ON_DIODE, LOW);
digitalWrite(ALARM_OFF_DIODE, HIGH);
//warunek czasowy osobno na syrene TODO
if(!silentMode && (millis() - alarmTriggeredTime >= siren_alarm_time)){
digitalWrite(SIREN, LOW);
}
prev_state = nottriggered;
}
}
【问题讨论】:
-
调试器会告诉你什么费用?它到底停在哪里?请参阅How to Ask 并提供minimal reproducible example。
-
system() 是同步的,所以 sendmail() 在 cmd 完成之前不会返回。
-
感谢@Olaf 建议使用调试器:D。它有很大帮助,这是 SIGSEGV 的错。 cmd 变量在一种情况下很小,它正在崩溃程序。谢谢!
标签: c email terminal terminate mutt