【问题标题】:C++ getline(string) segmentation fault with regards to multithreading关于多线程的 C++ getline(string) 分段错误
【发布时间】:2014-10-01 19:50:54
【问题描述】:

我为这个有点模棱两可的标题道歉,但我真的想不出更好的写法。

我正在为一个应该能够处理后台的类设计一个外壳。但是,因为启用后台时 shell 不会等待子进程,所以我认为最好创建第二个线程,其唯一目的是在子进程完成后清理子进程。现在这工作正常,直到子进程结束。当子进程结束时,我输入的下一个输入给我一个分段错误。使用 gdb,我发现错误来自我的 getline 函数。

我已经测试过了,std::cin 似乎不是问题。此外,当不做背景时,整个事情都可以正常工作,没有任何问题。

为了测试后台,我编写了一个程序 a.out 打印,休眠十秒钟,然后在退出前再次打印。 输出:

/Users/opname/Shell Project>./a.out&
/Users/opname/Shell Project>Sleep time!
ls
opshell   a.out     pseudocode.c    test.txt
opshell.cpp a.out.dSYM  shell.h     test2.txt
opshell.dSYM    gcctest.c   sleeper.c   testdir
/Users/opname/Shell Project>Awake time!
ls
Segmentation fault: 11

这是我 fork 进程并创建新线程的代码:

            pid_t cpid = fork();
            if (cpid > 0) {
                int status;
                if (conc) { // if backgrounding enabled
                    pthread_t waiter;
                    struct tcpara *pm = (struct tcpara*) malloc(sizeof(struct tcpara));
                    pm->cpid = cpid;
                    pm->status = &status;
                    pthread_create(&waiter, NULL, &thread_handler, (void*)pm);
                    pthread_detach(waiter);
                }
                else waitpid(cpid, &status, 0);
                break;

            } else if (cpid == 0) {
                loc += cmd;
                execv(loc.c_str(), argv);
                _exit(0);
            }

这是服务员线程调用的子程序:

void *thread_handler(void *pm) {
  struct tcpara *ofpm = (struct tcpara*) pm;
  waitpid(ofpm->cpid, ofpm->status, 0);
  free(pm);
  return NULL;
}

【问题讨论】:

    标签: c++ c multithreading shell fork


    【解决方案1】:

    尝试动态分配状态变量。当线程必须使用它时,它不再存在,因为它超出了范围。 我认为waiter 也会发生同样的情况。 您可以尝试将它们设为静态。

    【讨论】:

    • 真丢脸。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    • 2016-02-09
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 2015-11-08
    • 2012-05-10
    相关资源
    最近更新 更多