2009-07-21 7 views
3

私のコンソールアプリケーションで奇妙な問題に直面しています。コンソールアプリケーションのエコーオフ問題(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上を発生するので、この缶どのコンソールのバグでもありません。さらに、コンソール入力ハンドラをメインスレッドおよびコア機能/子スレッドのループに入れても違いはありません。

ご協力いただきありがとうございます。

+0

がValgrindの通過のコードを実行してみてください、あなたが任意のメモリの破損などがある場合、それは注意しましょう。 – LiraNuna

答えて

1

straceのコードを実行すると、端末の出力がオフになっている場所を正確に特定できます。

4

信号を受信したときにプログラムが正常に終了していません。原因はreadlineライブラリです。 readlineの文書がhere

0

感謝を扱う信号について言っていること

チェックは、GNU Readlineの図書館に応じて2つのクリーンアップ機能を追加することで問題を解決しました。

あなたが式の前に、以下の機能を追加する必要があります「debugInterfaceを削除;」:

rl_cleanup_after_signal(); 
rl_free_line_state(); 

[...] 

delete debugInterface; 
関連する問題