我为openWrt平台开发程序,当我启动带有选项前台的流程时,流程运行良好。
/usr/sbin/myprocess -f -b
(" -f, --foreground Run in the foreground\n")
(" -b, --boot Run with boot event\n")
最后,我使用命令Ctrl + C
停止进程。这会导致分段错误。
在我的主程序中,用于此的代码是:
void main ()
{
..........
..
bool foreground = false;
while (1) {
c = getopt_long(argc, argv, "fb", long_opts, NULL);
if (c == EOF)
break;
switch (c) {
case 'b':
start_event |= BOOT;
break;
case 'f':
foreground = true;
break;
}
}
pid_t pid, sid;
if (!foreground) { // *fourground false*
pid = fork();
if (pid < 0)
exit(EXIT_FAILURE);
if (pid > 0)
exit(EXIT_SUCCESS);
sid = setsid();
if (sid < 0) {
D("setsid() returned error\n");
exit(EXIT_FAILURE);
}
char *directory = "/";
if ((chdir(directory)) < 0) {
D("chdir() returned error\n");
exit(EXIT_FAILURE);
}
}
..........
}
我想知道在前台模式下启动的进程是否必须以特定方式停止。如何修改我的C代码以避免这种分段错误?
答案 0 :(得分:1)
使用-g
编译您的程序,然后在gdb
下运行您的程序。如果这是openwrt
,您可能需要使用远程gdb
。这将告诉你segfault的位置。
您需要阅读this page,以确保您知道如何将^C
传递给该计划,即使用
handle signal int nostop noprint pass
之前run
。
您已经向我们提供了调试信息,但我猜您在SIGINT
的信号处理程序或退出代码(假设您捕获信号)中存在问题,或者在__atexit
或类似的地方调用的东西。当退出例程尝试清理时,内存损坏偶尔也会导致这种情况 - 尝试在valgrind
下运行。