c-回显控制台应用程序中的问题(Linux)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c-回显控制台应用程序中的问题(Linux),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2777字,纯文字阅读大概需要4分钟。
内容图文
![c-回显控制台应用程序中的问题(Linux)](/upload/InfoBanner/zyjiaocheng/949/a1ec76f45743411ab587d02976943c15.jpg)
我在控制台应用程序中遇到一个奇怪的问题.
首先,代码片段:
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;
}
该代码运行正常且符合预期,但是当它通过捕获信号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文档关于信号处理here的内容
内容总结
以上是互联网集市为您收集整理的c-回显控制台应用程序中的问题(Linux)全部内容,希望文章能够帮你解决c-回显控制台应用程序中的问题(Linux)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。