C 程序在执行“系统”功能期间被中断

C program is interrupted during the execution of “system” function

我的 C 代码有问题,基本上我需要通过 mutt 程序发送电子邮件。它必须在 GPIO 引脚出现中断时发送。下面列出了我的 sendMail 函数。我通过使用 system 函数实现了这一点。 Main 包含带有 logAlarm 函数的循环,其中包含 sendMail。问题是当 system(cmd) 函数完成时, 整个 C 程序停止 。例如,当我将 sendMail 函数放在 main 函数的开头时,它可以工作,并且在不停止整个程序的情况下将电子邮件发送到我的邮箱,在循环中它设法发送它但它终止了程序。我尝试在后台使用 & 登录 运行 但它没有帮助。

P.S 我不知道这是否重要,但我也使用 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;
        }

}

好问题。根据描述,我认为 sendMail 功能正常工作。我没有和 mutt 一起工作过。但是我使用过 system()。

系统所做的是,它从当前进程派生一个子进程,并使用 execve() 执行命令。所以问题应该出在系统returning

所以,首先你应该检查return系统功能的状态。如果您能够在 system() 下创建 printf(),那么 system() 就没有问题。如果您无法在 system() 下获取 printf,则 system() 正在终止您的进程。 (通过发送 sigkill 或 similer 信号,但不发送 sigint 或 sigquit,因为它会被 system() 忽略)。您正在 cmd 本身中创建一个子进程(echo 输出管道到 mutt)。可能这应该是根本原因。

如果您在这里发现问题,那么问题很严重,您将从 "man system" 的 "NOTES" 部分找到指导,因为您已经实现了那里提到的相同逻辑。首先只是尝试等待那里提到的条件。如果您仍然无法执行此操作,请尝试从该子进程派生两个新的子进程,运行 execl 或任何其他 exec 系列函数 ("man 3 exec") 到 运行 echo 和 mutt .

如果system()没问题,那么检查logAlarm()。它是否为 sendMail 提供了正确的参数?如果你得到 "Error writing to log file!!!",那么整个序列就可以了。