使用Ctrl + C停止在前台启动的进程时出现分段错误

时间:2014-12-22 09:33:28

标签: c linux process openwrt

我为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代码以避免这种分段错误?

1 个答案:

答案 0 :(得分:1)

使用-g编译您的程序,然后在gdb下运行您的程序。如果这是openwrt,您可能需要使用远程gdb。这将告诉你segfault的位置。

您需要阅读this page,以确保您知道如何将^C传递给该计划,即使用

handle signal int nostop noprint pass

之前run

您已经向我们提供了调试信息,但我猜您在SIGINT的信号处理程序或退出代码(假设您捕获信号)中存在问题,或者在__atexit或类似的地方调用的东西。当退出例程尝试清理时,内存损坏偶尔也会导致这种情况 - 尝试在valgrind下运行。