![](/img/trans.png)
[英]How to send SIGTERM to a process by process name in QNX cpp code?
[英]ZMQ::send() throws an exception and kills the QNX-process. Why and how to recover from it?
ZMQ::send()
拋出異常並終止進程。
為什么以及如何從中恢復。
我在 QNX 版本 6.5.0 上使用 ZeroMQ REQ/REP
模式。 預期的catch{}
塊沒有收到此異常。
這是 gdb 跟蹤:
(gdb) bt
#0 0xb033e4a1 in SignalKill () from /opt/qnx650/target/qnx6/x86/lib/libc.so.3
#1 0xb032d0ee in raise () from /opt/qnx650/target/qnx6/x86/lib/libc.so.3
#2 0xb032b3a8 in abort () from /opt/qnx650/target/qnx6/x86/lib/libc.so.3
#3 0xb835c077 in std::do_abort () from /opt/qnx650/target/qnx6/x86/lib/libcpp.so.4
#4 0xb835c01e in std::terminate () from /opt/qnx650/target/qnx6/x86/lib/libcpp.so.4
#5 0xb8354ff3 in __cxa_throw () from /opt/qnx650/target/qnx6/x86/lib/libcpp.so.4
#6 0x080596bc in zmq::detail::socket_base::send (this=0x8071070, msg_=@0x7b22d38)
at /home/bindhu/rtcs/libzmq/include/zmq.hpp:1299
#7 0x0805b0a4 in dblog::SendPacketToDBLogger (this=0x8071068, ipc_can_msg=
{type = 0, timestamp = 1590330536976, can_id = 352260142, data = 2511882692165894191})
at /home/user/rtcs/canvehicle/dblog.cpp:203
#8 0x080530e3 in send_version_request (type=0 '\0', module=47 '/')
at /home/user/rtcs/canvehicle/CanVehicle.cc:4736
#9 0x08053f50 in p_thread_kalmar_version (arg=0x0)
at /home/user/rtcs/canvehicle/CanVehicle.cc:4749
#10 0xb0320390 in ?? () from /opt/qnx650/target/qnx6/x86/lib/libc.so.3
這是我的代碼片段。
dblog::dblog() :
context(1), socket(context, ZMQ_REQ) {
zmq_setsockopt (socket, ZMQ_LINGER, "", 0);
}
void dblog::Init() {
socket.connect("tcp://127.0.0.1:5555");
}
zmq::message_t create_values(protoTable.ByteSizeLong() + sizeof(uint16_t));
*((uint16_t*)create_values.data()) = TABLEMSG_ID; // ID
protoTable.SerializeToArray(create_values.data() + sizeof(uint16_t), protoTable.ByteSizeLong());
zmq::message_t reply;
try {
int returnv = socket.send(create_values,ZMQ_NOBLOCK);
socket.recv(&reply);
}
catch (int e)
{
std::cout << "SPD exception e : " << e << std::endl;
}
如果遵循 dbg()-輸出,則報告的行(如果使用最新版本) 與ZMQ_CPP11 #ifdef
塊中template<int Opt, class T, bool BoolUnit = false> struct integral_option{}
的模板定義相關:
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ zmq.hpp:1290
#ifdef ZMQ_CPP11
namespace sockopt
{
// There are two types of options,
// integral type with known compiler time size (int, bool, int64_t, uint64_t)
// and arrays with dynamic size (strings, binary data).
// BoolUnit: if true accepts values of type bool (but passed as T into libzmq)
template<int Opt, class T, bool BoolUnit = false> struct integral_option
{
};
...
} // namespace sockopt
#endif // ZMQ_CPP11
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ zmq.hpp:1577
如果源代碼和 C++ 版本 11 都適合並且可以正常工作,請添加更多調試啟用代碼,以在調用實際.send()
方法之前檢查create_values
變量的預先分析內容。
一些assert()
-s 也將是公平的,例如
assert( socket.connect() == 0
&& "INF:: a call to .connect()-method failed, better inspect the <errno>"
);
或者
assert( 0 == zmq_setsockopt( socket, ZMQ_LINGER, "", 0 )
&& "INF:: a call to zmq_setsockopt() API failed, better inspect the <errno>"
);
在這里,我不敢滿足API定義,所以寧願調用
zmq_setsockopt( socket, ZMQ_LINGER, &linger, sizeof (linger) )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.