我有一个通过Boost.Asio运行的多线程应用程序.boost::asio::io_service整个应用程序只有一个,所有的东西都是由一组线程完成的.有时需要使用fork和exec生成子进程.当孩子终止时,我需要在上面做waitpid以检查退出代码和收集僵尸.我最近添加boost::asio::signal_set但是在使用linux-2.4.*内核的古老系统中遇到了问题(不幸的是仍然被一些客户使用).在较旧的Linux内核下,线程实际上是一个特殊的进程情况,因此如果一个子程由一个线程生成,另一个线程无法使用waitpid系统调用系列等待它.Asio的signal_set将信号处理程序发布到,io_service并且运行此服务的任何线程都可以运行此处理程序,这不适合我的情况.所以我决定以旧的良好信号/ sigaction方式处理信号 - 所有线程都有相同的处理程序来调用waitpid.所以还有另一个问题:
当处理程序捕获信号并且进程成功进行sigwaited时,如何io_service从处理程序"发布"给我?在我看来,显而易见的io_service::post()方法是不可能的,因为io_service如果信号在错误的时间发生,它可能会在内部互斥锁上死锁.我想到的唯一一件事就是使用一些管道或socketpair来async_wait在那里写通知,而另一端则是为了处理poll()事件循环中的信号.
还有更好的解决方案吗?
我正在编写一个解析器,用于使用缩进等非常复杂的配置文件.我决定使用Lex将输入分解为令牌,因为它似乎使生活更轻松.问题是我找不到任何使用Qi错误报告工具(on_error)的示例,其中解析器使用令牌流而不是字符进行操作.
要使用的错误处理程序on_error需要一些能够准确指示错误在输入流中的位置.所有示例都只是std::string从迭代器对构造并打印出来.但是如果使用Lex,则迭代器是标记序列的迭代器,而不是字符.在我的程序中,这导致std::string在我注意到无效的迭代器类型之前挂起构造函数.
据我所知,令牌可以将输入流的一对迭代器作为其值.这是默认属性类型(如果类型是这样lex::lexertl::token<>).但是,如果我想我的令牌包含一些解析(更多有用的int,std::string等等),这些迭代器都将丢失.
如何在使用带Qi的Lex时生成指示输入流中位置的人性化错误消息?有这种用法的例子吗?
谢谢.