运行 C 程序使用 systemd 时的核心转储

Core dump when running C program using systemd

我有一个 C 语言程序,当 运行 直接从命令行对其进行 运行 运行时它运行良好,但当 运行 使用 systemd 对其进行运行时 运行 运行失败:

Core was generated by `/usr/local/bin/midnite-modbusd'.
Program terminated with signal SIGFPE, Arithmetic exception.
#0  0x0000000000401308 in main (argc=1, argv=0x7ffeae390268) at src/midnite-modbusd.c:139
139                     slen= interval - (millis % interval);

有问题的代码:

//wait for start of each sample interval
gettimeofday(&tv,NULL);
millis= (long long unsigned)tv.tv_sec*1000 + (tv.tv_usec/1000);
slen= interval - (millis % interval);
i= (millis+slen) % 1000;
usleep (slen*1000);

完整代码is available on github.

系统单位:

[Unit]
Description=Midnite Classic modbus data polling
After=network.target

[Service]
Type=simple
User=midnite-modbusd
ExecStart=/usr/local/bin/midnite-modbusd
Restart=on-failure

[Install]
WantedBy=multi-user.target

程序 运行 与 systemd 有什么不同?

编辑 1

看来我的程序有重大问题,只有在 运行 systemd:

时才会发生

作为我使用命令行测试的旁注 I 运行: sudo -H -u midnite-modbusd /usr/local/bin/midnite-modbusd

配置文件中定义的sample_interval值会初始化interval,请检查文件是否正确sample_interval 存在。 interval 的未初始化值可能会导致被零除异常

我在这段代码中发现了问题:

if (getppid()==1) {
    sprintf(str, "Daemon aready running");
    log_message(log_file_path,(char*)str);
    return;
}

当程序打算将自身作为 "old style" 守护进程派生到 运行 时,此代码出现在此处。 我没有意识到,因为 systemd 正在分叉它,所以程序有一个父进程(因此 getppid() 返回 1 当 运行 systemd 但不是来自命令行时)

反正写的不好:这个测试应该停止脚本。