草庐IT

c++ - 如果我收到信号,我的程序的退出代码应该是什么?

我想我可能已经做错了一段时间,因为我们刚刚切换到systemd,它认为我干净利落地终止的进程未成功结束。基本上我会监听SIGHUP、SIGINT和SIGTERM,然后(通过将信号代码传回到main)干净地例如返回128+SIGHUP。我原以为这是用来填充$?的,但现在我想我明白了shell负责给$?这样的值,然后仅当信号未处理时。因此,即使进程最终由于信号而退出,因为信号已被处理,$?最终将变为0并且所有证据表明信号与退出会丢失。是吗?当处理SIGHUP并完全退出时,我是否应该从main中返回EXIT_SUCCESS? 最佳答案 返

c++ - SDL2 & GDB : program received signal ?,未知信号

让我们从描述发生的事情开始:我正在Windows上使用SDL2库。我可以使用它编译程序,当我运行.exe时,它​​工作得很好。当我尝试使用GDB调试它时出现问题-当代码进入SDL_Init或SDL_OpenAudio函数(可能创建新线程)时,GDB停止,显示“程序收到信号?,未知信号”消息,当我恢复执行时程序崩溃。显然GDB(https://www.mail-archive.com/cygwin@cygwin.com/msg149735.html)中存在与线程命名相关的错误,应该在GDB版本7.11.1-1中修复。起初我使用GCC5.1.0(TDM)和GDB7.6.1,所以我决定更新到

c++ - boost::signals 插槽是同步调用还是异步调用?

谁能告诉我boost::signals插槽是同步调用还是异步调用?例如我有这段代码:structHello{voidoperator()()const{std::coutsig;sig.connect(Hello());sig.connect(World());sig();cout执行线程是如何工作的?执行是等待Hello()和World()执行,然后才打印"Foo"还是异步调用它们(打印“Foo”并调用Hello()和World()以未定义的顺序执行)? 最佳答案 在Boost.Signals插槽被同步调用,并且连接到同一信号的插

c++ - signal() 覆盖其他信号处理程序

signal()函数是否会覆盖进程可能已设置的其他信号调用?IE。如果进程设置了SIGINT处理程序,并且DLL调用signal(SIGINT,xxx)来处理它自己的终止代码,那么原始的SIGINT处理程序被禁用? 最佳答案 signal()调用:安装您指定的处理程序作为新的信号处理程序,并且告诉您旧的处理程序是什么。将调用新的处理程序而不是旧的处理程序。如果你想链接它们,你需要做类似的事情:typedefvoid(*Handler)(intsignum);staticHandlerold_int_handler=SIG_IGN;s

c++ - 级联和信号/槽

我正在为这事兜圈子。就是无法理解信号和插槽。只是在寻找某种机制,当我的C++中出现信号时可以自动更新我的UI。示例:我在Qml中有两个带有文本的标签:返回值的_app.method。我有一个onClicked运行Q_INVOKABLE方法的按钮。该方法在完成时发出一个信号,例如,获取地理坐标并更新上述文本:赋值所依赖的值。我想要的是更新文本:一旦这些值发生变化就赋值。我只需要清楚地解释这些信号/槽。文档中的唯一示例似乎只假设QML或C++,而不是两者的混合。示例代码有示例,但文档中没有具体说明。如果你有简单的描述,我相信我能适应它。例如,1:在QML中定义,2:在hpp文件中定义,3:

c++ - 确定插槽是否连接到给定信号

我很想知道是否有某种方法可以确定是否存在与我在类中定义的给定信号的连接。它基本上是一个处理数据的信号,我不在乎它连接到什么,但我想包括一个完整性检查,以确保我不会将数据发送到永远不会被看到的空隙中。我已经查看了DeterminesignalsconnectedtoagivenslotinQt,但这是一个相反的问题。 最佳答案 QObject::isSignalConnected()正是用于该用例-避免在没有人收听时准备信号发射的不必要工作。它的APIdocs甚至还有一个很好的例子。示例:staticconstQMetaMethodv

c++ - C/C++ 处理程序 SIGFPE 是什么?

好吧,我搜索了有关SIGFPE的文章,然后我写了一些测试,但它的行为很奇怪。那我只好贴在这里求助了。GCC/G++或ISOC++是否明确定义了除以零时会发生什么?1)我搜索了这篇文章:DivisionbyzerodoesnotthrowSIGFPE相同的输出是inf2)如果我改写如下:voidsignal_handler(intsigno){if(signo==SIGFPE){std::cout那么signal_handler就不会发生了。但是如果我取消注释该行//fprintf(stderr,"dnumberis%d\n,d);然后signal_handler继续调用。谁能解释一下?

c++ - 随机时间延迟

我正在尝试在进程之间发送信号,我需要在我的信号生成循环中允许0.01到0.1秒之间的随机时间延迟。所以这就是我正在做的,它肯定不在0.01到0.1之间,但结果为1秒。不确定我在这里遗漏了什么。sleepTime=100000L+(long)((1e6-1e5)*rand()/(RAND_MAX+1.0));usleep(sleepTime); 最佳答案 如果你有C++11:#include#include#includeintmain(){std::mt19937_64eng{std::random_device{}()};//or

c++ - 保护主线程免受工作线程中的错误

当使用posix线程时,是否有一些方法可以“保护”主线程免受工作线程引起的错误(例如取消引用的空指针、被零除等)的影响。“工作线程”是指由pthread_create()创建的posix线程。不幸的是,我们不能使用异常——所以没有“catch”等。这是我的测试程序(C++):void*workerThreadFunc(void*threadId){int*a=NULL;*a=5;//Error(segmentationfault)pthread_exit(NULL);}intmain(){cout在上面的例子中,workerThread引起的错误会终止整个程序。但是尽管有这个错误,我还

c++ - 如何在 C++ 中处理中断信号和调用析构函数?

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:IsdestructorcalledifSIGINTorSIGSTPissued?我的代码是这样的:#include#include#includevoidhandler(int){std::cout当我按下Ctrl-C时,它打印出:constructor^Cwillexit...没有打印“析构函数”。那么,我怎样才能干净利落地退出呢?