带有线程的C ++主程序需要Ctrl + C两次才能退出

时间:2015-08-20 11:55:30

标签: c++ multithreading pthreads signals

我正在运行下面的C ++程序,在Ubuntu上面有一个线程。
为什么要退出程序需要两次Ctrl + C调用? 我注意到第一个Ctrl + C I问题只关闭了myThread。

注意:我确信在第一个Ctrl + C之后myThread线程不再存在。这是我通过做ps aux发现的。只有在第二次Ctrl + C后才能获得打印main_recv_sigint: Executed 在我的生产代码中,我正在使用python代码而不是sleep 1000

如何让一个Ctrl + C完全关闭它?

#include <iostream>
#include <signal.h>
#include <thread>
#include <cstdlib>
#include "unistd.h"
#include <cstdio>

void *myThread(void *params)
{
    std::string cmd = "sleep 1000";
    if (system (cmd.c_str ()));

    return NULL;
}

void main_recv_sigint (int sig);
bool runMainThread = true;

int main(int argc, char *argv[])
{
    pthread_t threadID;
    pthread_create(&threadID, NULL, myThread, NULL);

    signal(SIGINT, main_recv_sigint);

    while (runMainThread) {
        while (runMainThread)
            sleep(2);

        if (!runMainThread)
            break;
    }

    printf("Waiting for myThread() to exit\n");
    pthread_join(threadID, NULL);
    printf("Wait for myThread() exit done\n");

    return 0;
}

void main_recv_sigint (int sig)
{
    printf("main_recv_sigint: Executed\n");
    runMainThread = false;
    return;
}

1 个答案:

答案 0 :(得分:2)

有两件事可以解释这种行为:

  1. system causes the calling process to ignore SIGINT在等待其子女终止时
  2. Ctrl - C 将SIGINT发送到整个前台进程组,其中包括您的程序及其子 sleep
  3. 因此,第一个 Ctrl - C 会终止子 sleep 进程但被父进程忽略 - 永远不会调用处理程序 - 继续不知不觉地循环。第二个 Ctrl - C 提供一个SIGINT,由父级按照您的预期处理。

    关于你的第二个问题,“我怎样才能让一个Ctrl + C完全关闭它?”,你需要重新设计。 system是一个旧函数,设计时没有考虑线程,有点特殊,可能不适合您的用例。