使用POSIX消息队列或Unix域套接字进行本地IPC通信是否更好?
我曾经在机器之间使用Unix套接字(不是域名),我记得制作和断开连接会导致套接字在最终消失之前停留一段时间.此外,如果您想要"可靠"的交换,您必须使用TCP或设计应用程序以返回ACK.我不确定这是否也适用于Unix域套接字.
在我目前的项目中,我们需要本地IPC.我的第一反应是使用POSIX MQueues,因为我之前使用它们进行本地消息传递.但是,一位同事正在建议使用Unix域套接字.
是一个比另一个更好,还是编程熟悉的问题?或者它可能取决于正在创建的应用程序?
从总体上看,我们正在开发的应用程序遵循客户端/服务器模型.客户端向服务器发送消息以"做某事".但是,客户端不会等待"完成"响应 - 尽管他们确实想知道他们的请求是否已被接收.
发送方的基本逻辑是:
connect to server
send request
note if the send worked or not
disconnect from server
Run Code Online (Sandbox Code Playgroud)
一台服务器可能有数百个客户端.
我们正在运行Linux操作系统的SMP系统(4-8个核心)上执行.
提前致谢.
问候所有,
是否有可能在C++中创建一个未来安全的比较运算符(==)?
我遇到的问题是我们有一个有多个成员的班级.我们有一个比较运算符来验证对象的instance-1是否与instance-2具有相同的值.
即我们可以做到
class blarg {
.....
};
.....
blarg b1(..initializers...);
blarg b2 = b1;
if (b1 == b2) {
... then do something ....
}
Run Code Online (Sandbox Code Playgroud)
但是,我有一个同事在该类中添加了一个新成员,但未能更新比较运算符.这导致我们需要一段时间才能弄明白的问题.
有没有一种编码习惯,我的意思是其他比代码审查(失败对我们来说),或编码方法,设计,模板,魔豆,不管这可能有助于避免这样的情况?
我的第一反应是使用memcmp命令.但是,在阅读" 比较C与C++中的结构 "的堆栈溢出条目后,我发现这可能会有问题,因为C++类不仅仅包含内部的成员数据.
别人怎么处理这个?
预先感谢您的帮助.
我想重新编译我们的boost库,但是使用了-g,启用了调试标志.我一直在阅读,看到我们建立了提升jam.虽然我make很清楚,但我jam一直都没有,而且我的挫败感越来越大.
如何从序列化数据中"序列化"派生类?或许我应该说,有没有更好的方法将数据"反序列化"为派生类?
例如,假设你有一个纯虚基类(B),它由其他三个类X,Y和Z继承.而且,我们有一个方法serialize(),它将翻译X:B,Y:B和Z:B成序列化数据.
通过这种方式,可以将套接字,命名管道等连接到远程进程.
我遇到的问题是,我们如何从序列化数据中创建一个合适的对象?
我能想到的唯一解决方案是在序列化数据中包含一个标识符,用于指示最终的派生对象类型.接收者首先从序列化数据中解析派生类型字段,然后使用switch语句(或类似的某种逻辑)来调用适当的构造函数.
例如:
B deserialize( serial_data )
{
parse the derived type from the serial_data
switch (derived type)
case X
return X(serial_data)
case Y
return Y(serial_data)
case Z
return Z(serial_data)
}
Run Code Online (Sandbox Code Playgroud)
因此,在学习派生对象类型之后,我们调用适当的派生类型构造函数.
然而,这感觉很尴尬和麻烦.我希望有一种更有说服力的方式来做到这一点.在那儿?
我正在编写一个需要root用户权限才能执行的应用程序.如果由非root用户执行,它将以perror消息退出并终止,例如:
pthread_getschedparam: Operation not permitted
Run Code Online (Sandbox Code Playgroud)
我想使应用程序更加用户友好.作为其早期初始化的一部分,我希望它检查它是否由root执行.如果不是root,它将显示一条消息,指示它只能由root运行,然后终止.
在此先感谢您的帮助.
这是我正在寻找的.
我想找到一个格式化输出文本的库或方法,这样它的文字包装在80列(或用户可配置),并允许用户定义的缩进.
我知道我可以创建一个,但我怀疑已经有一个可用的库可以做到这一点.我已经google了一下,我找到了iomanip的页面 - 这给了我创建自己的想法.
我已经对boost库进行了粗略的搜索,但我并没有找到任何匹配的东西.
我们有一个通过RPM分发的产品.我们创建了SUSE SLES10 SP1 RPM和RedHat 5.5 RPM.两者之间存在差异,如果在RedHat机器上安装SUSE RPM,反之亦然,事情将无法正常工作(通常是神秘的).
有没有办法阻止RedHay RPM安装在SUSE系统上,反之亦然?我搜索了这个并找到了http://www.rpm.org/max-rpm/ch-rpm-multi.html,但这里的所有约束似乎都是基于命令的输出uname而不是告诉你是否你正在运行RedHat或Suse.操作系统是Linux,架构是一样的.
我们有想法在安装脚本中添加检查,可以在/ etc/issue文件中查找"Red Hat"或"SUSE",但我真的希望有比这更好的选项.
我发现我的bash脚本的结果会改变,具体取决于我是否通过调试执行它(即调用set -x).我并不是说我得到更多输出,但程序本身的结果不同.
我假设这不是理想的行为,我希望你能教会我如何纠正这个问题.
下面的bash脚本是一个人为的例子,我尝试从我正在调查的脚本中减少逻辑,以便问题可以很容易地重现和显而易见.
#!/bin/bash
# Base function executes command (print working directory) stores the value in
# the destination and returns the status.
function get_cur_dir {
local dest=$1
local result
result=$((pwd) 2>&1)
status=$?
eval $dest="\"$result\""
return $status
}
# 2nd level function uses the base function to execute the command and store
# the result in the desired location. However if the base function fails it
# terminates the script. Yes, I know 'pwd' won't fail -- …Run Code Online (Sandbox Code Playgroud) 是的,这似乎非常类似于" 查找git分支的父分支 ",但我没有找到我的答案.
我想我想知道如何找到我当前的分支父母,但我可能会问错误的问题.所以我会提供我的方案.
我们的组织有几个长期运行的发布分支,不会重命名(但最终在发布后不推荐)
有时我会从其中一个发布分支创建一个功能分支来处理问题.这是一个本地特色分支.
我被叫去处理其他一些项目,其他一些发布等.
我回到这个功能,现在我想将它重新绑定到它最初分支的最新提交.但是已经过了足够的时间,我不记得这是从版本x或发布y分支出来的
那我该怎么做?在我看来,我以为我会弄清楚我创建了哪个发布分支,然后重新绑定到该分支上的最后一次提交.
我知道还有其他组织技术可以避免这个问题,比如总是在我的功能分支中包含基本分支的名称.但那艘船已经开航了.
git我遇到的挑战是否有解决方案?
第三方供应商正在添加身份验证(耶!),但它并不总是对我们有用(嘘!)。
当 C# 应用程序以“管理员身份”运行时,它可以正常工作。但是,当应用程序作为普通(非管理员)用户运行时,它会失败并显示消息
“身份验证失败,因为远程方已关闭传输流”
我们明确设置为 TLS 1.2
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
Run Code Online (Sandbox Code Playgroud)
我们是
我有一个模板化的基类,提供方法remove().我有一个派生自模板化基类的类,它不隐藏remove()方法.但是,基于模板的类的remove方法不可见.为什么?有没有办法解决这个问题(我的意思是除了我最后想到的'技巧')?
我已将其删除为一个小代码示例:
#include <map>
#include <iostream>
#include <boost/shared_ptr.hpp>
// Common cache base class. All our caches use a map, expect children to
// specify their own add, remove and modify methods, but the base supplies a
// single commont remove too.
template <class T>
class cache_base {
public:
cache_base () {};
virtual ~cache_base() {};
virtual void add(uint32_t id) = 0;
virtual void remove(uint32_t id) = 0;
void remove() {
std::cout << "This is base remove\n";
};
virtual void modify(uint32_t id) …Run Code Online (Sandbox Code Playgroud)