私のコンソールアプリケーションで奇妙な問題に直面しています。コンソールアプリケーションのエコーオフ問題(Linux)
まず、コードスニペット:
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;
}
DebugInterface.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();
};
DebugInterface.cpp
#include "DebugInterface.h"
void* DebugInterface::ConsoleHandler (void* param) {
while (true) {
char* input = readline ("\n> ");
// Handle input, was commented out, too (irrelevant for problem)
free (input);
}
return NULL;
}
bool DebugInterface::StartReading() {
if (pthread_create (&ConsoleHandlerThread, NULL, DebugInterface::ConsoleHandler, NULL) != 0) {
return false;
}
return true;
}
コードが実行されています罰金とeシグナル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上を発生するので、この缶どのコンソールのバグでもありません。さらに、コンソール入力ハンドラをメインスレッドおよびコア機能/子スレッドのループに入れても違いはありません。
ご協力いただきありがとうございます。
がValgrindの通過のコードを実行してみてください、あなたが任意のメモリの破損などがある場合、それは注意しましょう。 – LiraNuna