【问题标题】:Why background process could be interrupted after some time of successful execution? (exit code 248)为什么在成功执行一段时间后后台进程可能会被中断? (退出代码 248)
【发布时间】:2015-09-16 22:05:55
【问题描述】:

我为 Raspberry Pi 编写了一个 C 程序,它从两个读卡器读取 Wiegand 卡 ​​ID 并放入一个文本文件。程序基于pigpio library,实际上只是修改示例:

#include <stdio.h>
#include <pigpio.h>
#include "wiegand.h"


void callback1(int bits, uint32_t value)
{

    FILE *saved = stdout;
    stdout = fopen("log_readers.txt", "a");
    printf("Reader_1: bits=%d value=%u\n", bits, value);
    fclose(stdout);
    stdout = saved;
}

void callback2(int bits, uint32_t value)
{
   FILE *saved = stdout;
   stdout = fopen("log_readers.txt", "a");   
   printf("Reader_2: bits=%d value=%u\n", bits, value);
   fclose(stdout);
   stdout = saved;
}

int main(int argc, char *argv[])
{
   Pi_Wieg_t * w1;
   Pi_Wieg_t * w2;
   if (gpioInitialise() < 0) return 1;
   w1 = Pi_Wieg(14, 15, callback1, 5);
   w2 = Pi_Wieg(23, 24, callback2, 5);
   sleep(300);
   Pi_Wieg_cancel(w1);
   Pi_Wieg_cancel(w2);
   gpioTerminate();
}

当我编译并运行程序时,一切正常 (用tail -f检查log_readers.txt文件)

当我在后台模式下运行二进制文件时

sudo ./all_readers.bin &

它也正确执行,但一段时间后停止工作。

运行ps后立即查看进程:

pi@raspberrypi ~/sandbox $ ps ax | grep all_readers
 3768 pts/0    S      0:00 sudo ./all_readers.bin
 3769 pts/0    SLl    0:00 ./all_readers.bin

但是如果我在 5 分钟后运行相同的命令,在 ps 中没有输出:

pi@raspberrypi ~/sandbox $ ps ax | grep all_readers
 3782 pts/0    S+     0:00 grep --color=auto all_readers
[2]-  Exit 248                sudo ./all_readers.bin

看起来进程已终止。根据我的观察,它不取决于阅读卡等与程序相关的事件。在 RAM 和磁盘上也有足够的可用内存。我试图通过 pidstat 实用程序发现问题,但没有看到任何错误字符串。

退出代码 248 是什么意思?终止后台进程的原因可能是什么以及如何诊断?

非常感谢任何建议。

【问题讨论】:

  • 首先将 return 0; 添加到 main() 的末尾(c99 (IIRC) 不需要,但仍然是很好的做法,恕我直言)
  • 可能是内存泄漏? “足够的可用内存”可能会逐渐消失。
  • 你为什么fopen()一个文件,printf(),然后又fclose()这个文件?你确实意识到printf()打印到stdout,不是吗?
  • @EOF:很好的发现:过时的指针。
  • OP 似乎正在使用stdout 写入文本文件。为什么不打开FILE *saved 并使用fprintf?

标签: c linux process raspberry-pi raspbian


【解决方案1】:

没有注意到明显的事情。需要删除sleep(300)并像这样while (1) { sleep(1); }进行无限循环

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-20
    • 2010-11-30
    • 1970-01-01
    相关资源
    最近更新 更多