带有线程的c++主程序需要按Ctrl+C两次才能退出
C++ main program with a thread requires Ctrl+C twice in order to exit
我正在运行下面的c++程序,在Ubuntu中有一个线程。
为什么需要两次Ctrl+C调用才能退出程序?
我注意到我对它发出的第一个Ctrl+C只关闭了myThread。
注意:我确信myThread线程在第一个Ctrl+C后停止存在。这是我在做ps时发现的。在第二次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 exitn");
pthread_join(threadID, NULL);
printf("Wait for myThread() exit donen");
return 0;
}
void main_recv_sigint (int sig)
{
printf("main_recv_sigint: Executedn");
runMainThread = false;
return;
}
有两点可以解释这种行为:
-
system
导致调用进程在等待子进程终止时忽略SIGINT - Ctrl-C发送一个SIGINT到整个前台进程组,包括你的程序和它的子进程sleep
因此,第一个Ctrl-C杀死子进程sleep,但被父进程忽略——处理程序永远不会被调用——继续不知道循环。第二个Ctrl-C传递一个SIGINT,该SIGINT如您所期望的那样由父进程处理。
至于你的第二个问题,"我怎么能有一个Ctrl+C完全关闭它?",您需要重新设计。system
是一个老函数,设计时没有考虑线程,有点特殊,可能不适合您的用例。
相关文章:
- g++的分段错误(在NaN上使用to_string两次时)
- 蛇在C++不会连续转两次
- 检查一个数组是否包含在另一个数组中,以相反的顺序,至少两次
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 我应该如何去缓解两次出现的cin?
- Realloc 两次无法在 Visual Studio 上运行
- 使用 getline(cin, var) 两次在进行字符串比较时会产生错误 (==)
- 为什么映射插入和 map.find() 的单次迭代比插入和 map.find() 的两次单独迭代慢得多
- C++析构函数调用两次,堆栈分配的复合对象
- 为什么参数在构造 std::thread 时移动两次
- Qt插槽调用了两次
- 做 std::用相同的unique_ptr移动两次
- C++两次定义相同的函数会导致错误
- 为什么具有静态存储持续时间的同一内联变量在包含在 VS2017 编译的两个翻译单元中时会构造和销毁两次
- 对于优化级别为 0 的 std::vector,析构函数被调用两次
- 使用柯南打包时如何避免列出两次依赖?
- 为什么要执行两次位移((x >> 4)<< 4)?
- 对结构向量进行两次排序
- 我找不到导致我的数组在运行两次案例并退出后损坏的错误
- 带有线程的c++主程序需要按Ctrl+C两次才能退出