Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 控制台应用程序(Linux)中的回显关闭问题_C++_Linux_Console - Fatal编程技术网

C++ 控制台应用程序(Linux)中的回显关闭问题

C++ 控制台应用程序(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

我在控制台应用程序中面临一个奇怪的问题

首先,代码片段:

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 (&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;