C++ 控制台应用程序(Linux)中的回显关闭问题
我在控制台应用程序中面临一个奇怪的问题 首先,代码片段: main.cppC++ 控制台应用程序(Linux)中的回显关闭问题,c++,linux,console,C++,Linux,Console,我在控制台应用程序中面临一个奇怪的问题 首先,代码片段: main.cpp #include "DebugInterface.h" static sigset_t signalSet; static pthread_t CleanupHandlerThread; DebugInterface* debugInterface = NULL; void* CleanupHandler (void* param) { int32_t sig, err; err = sigwait
#include "DebugInterface.h"
static sigset_t signalSet;
static pthread_t CleanupHandlerThread;
DebugInterface* debugInterface = NULL;
void* CleanupHandler (void* param) {
int32_t sig, err;
err = sigwait (&signalSet, &sig);
delete debugInterface;
debugInterface = NULL;
exit (EXIT_SUCCESS);
return NULL;
}
int32_t main(int32_t argc, char** argv) {
sigemptyset (&signalSet);
sigaddset (&signalSet, SIGINT);
pthread_sigmask (SIG_BLOCK, &signalSet, NULL);
pthread_create (&CleanupHandlerThread, NULL, CleanupHandler, NULL);
debugInterface = new DebugInterface();
if (debugInterface != NULL) {
debugInterface->StartReading();
}
while (true) {
// Core functionality follows, but was commented out
// (was not relevant for problem, checked it -
// you may even remove this loop completely)
}
return EXIT_SUCCESS;
}
调试接口.h
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <iomanip>
#include <readline/readline.h>
#include <readline/history.h>
#include <signal.h>
class DebugInterface {
public:
DebugInterface() { }
virtual ~DebugInterface() { }
private:
pthread_t ConsoleHandlerThread;
private:
static void* ConsoleHandler (void* param);
public:
bool StartReading();
};
代码运行正常,符合预期,但当它通过捕获信号SIGINT退出和终止时,随后的控制台输出被隐藏(即控制台/终端的行为类似于应用命令“stty-echo”)
我已经插入了代码“system”(“stty echo”);”在函数CleanupHandler中,它在退出之前“解决”了问题,但这不是正确的解决方案。。。也许我错过了一个没有出现的严重错误。我也不知道我的代码在终止后如何影响控制台输出/终端本身,因为没有任何系统调用/函数调用可能会改变控制台行为(我只使用“printf”和控制台输出的颜色格式)
上面的代码段应重现问题,编译器/链接器配置和输出为:
make all
Building file: ../main.cpp
Invoking: GCC C++ Compiler
g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"main.d" -MT"main.d" -o"main.o" "../main.cpp"
Finished building: ../main.cpp
Building target: Testproject
Invoking: GCC C++ Linker
g++ -o"Testproject" ./DebugInterface.o ./main.o -lreadline -lpthread
Finished building target: Testproject
我是在服务器上远程开发的,问题是以这种方式发生的,而且也是通过SSH发生的,所以这不可能是任何控制台错误。此外,将控制台输入处理程序放在主线程中,将核心功能/循环放在子线程中并没有什么区别
提前感谢您的帮助。在
策略下运行代码,您可能会准确地找到关闭终端输出的位置。您的程序在收到信号时没有完全终止。原因是readline库
查看readline文档中关于信号处理的内容谢谢,根据GNU readline库添加了两个清理函数,解决了这个问题
必须在表达式“delete debugInterface;”之前添加以下函数:
尝试通过Valgrind运行代码,它会注意到您是否有任何内存损坏或类似情况。
make all
Building file: ../main.cpp
Invoking: GCC C++ Compiler
g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"main.d" -MT"main.d" -o"main.o" "../main.cpp"
Finished building: ../main.cpp
Building target: Testproject
Invoking: GCC C++ Linker
g++ -o"Testproject" ./DebugInterface.o ./main.o -lreadline -lpthread
Finished building target: Testproject
rl_cleanup_after_signal();
rl_free_line_state();
[...]
delete debugInterface;