gpt4 book ai didi

c++ - 具有更多参数的信号处理程序

转载 作者:行者123 更新时间:2023-11-28 04:14:37 25 4
gpt4 key购买 nike

我在 Ubuntu 18.04.2 LTS 上使用 ROS Melodic 和 Gazebo 9.9.0。

我想在用户杀死节点时向机器人发送一条“停止”消息(一条全为零的 Twist 消息)。

为了处理 Ctrl.+C 事件,我使用了这个:

/**
* Override the default ros sigint handler to stop the robot when user press
* Ctrl.+C.
*/
void sigintHandler(int sig)
{


// All the default sigint handler does is call shutdown()
ros::shutdown();
}

但是这个函数不允许传递更多的参数(我需要传递cmd_vel_pub)。

我已经在主函数上声明了这个发布者:

int main(int argc, char **argv)
{
ros::init(argc, argv, "astar_controller");

ros::NodeHandle n;

// Override the default ros sigint handler.
// This must be set after the first NodeHandle is created.
std::signal(SIGINT, sigintHandler);

/**
* Topic where we are going to publish speed commands.
*/
ros::Publisher cmd_vel_pub = n.advertise<geometry_msgs::Twist>(cmdTopic, 1000);

// More code...
}

也许我可以将 cmd_vel_pub 声明为全局。

有什么方法可以将更多参数传递给 sigintHandler 还是我需要将其声明为全局的?

最佳答案

可以从信号处理程序调用的函数列表有限,请参阅 man signal-safety .因此,从信号处理程序上下文中发送 Twist 消息可能是不可能的。

self-pipe trick通常用于处理信号处理程序上下文之外的信号:

Maintain a pipe and select for readability on the pipe input. Inside the signal handler, write a byte (non-blocking, just in case) to the pipe output. Done.

除此之外,我建议将信号编号字节写入管道,这样您就可以对任何信号(如果适用)使用完全相同的信号处理程序和管道。

希望处理信号的线程必须等待管道的读取端变为可读,读取该字节并处理信号。可以使用事件循环(例如 selectepoll 等)或阻塞 read 调用来完成等待。

或者,您可以使用 signalfd而不是管道(参见此处的示例)。或者 sigsuspend 阻塞并等待信号。

关于c++ - 具有更多参数的信号处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56947553/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com