小编Joh*_*cha的帖子

哪个更适合本地IPC,POSIX消息队列(mqueues)或Unix域(本地)套接字?

使用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 c++ sockets posix ipc

22
推荐指数
2
解决办法
1万
查看次数

可以用C++制作"未来安全"比较运算符吗?

问候所有,

是否有可能在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++类不仅仅包含内部的成员数据.

别人怎么处理这个?

预先感谢您的帮助.

c++ class operator-overloading

10
推荐指数
2
解决办法
322
查看次数

如何用-g debug标志编译boost?

我想重新编译我们的boost库,但是使用了-g,启用了调试标志.我一直在阅读,看到我们建立了提升jam.虽然我make很清楚,但我jam一直都没有,而且我的挫败感越来越大.

c++ boost jam bjam

10
推荐指数
1
解决办法
3937
查看次数

如何从序列化数据中"序列化"派生类?

如何从序列化数据中"序列化"派生类?或许我应该说,有没有更好的方法将数据"反序列化"为派生类?

例如,假设你有一个纯虚基类(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)

因此,在学习派生对象类型之后,我们调用适当的派生类型构造函数.

然而,这感觉很尴尬和麻烦.我希望有一种更有说服力的方式来做到这一点.在那儿?

c++ serialization

9
推荐指数
1
解决办法
2442
查看次数

我的C/C++应用程序如何确定root用户是否正在执行命令?

我正在编写一个需要root用户权限才能执行的应用程序.如果由非root用户执行,它将以perror消息退出并终止,例如:

    pthread_getschedparam: Operation not permitted
Run Code Online (Sandbox Code Playgroud)

我想使应用程序更加用户友好.作为其早期初始化的一部分,我希望它检查它是否由root执行.如果不是root,它将显示一条消息,指示它只能由root运行,然后终止.

在此先感谢您的帮助.

c c++ linux root

5
推荐指数
4
解决办法
8675
查看次数

是否有用于80列格式文本输出的图书馆/方法?

这是我正在寻找的.

我想找到一个格式化输出文本的库或方法,这样它的文字包装在80列(或用户可配置),并允许用户定义的缩进.

我知道我可以创建一个,但我怀疑已经有一个可用的库可以做到这一点.我已经google了一下,我找到了iomanip的页面 - 这给了我创建自己的想法.

我已经对boost库进行了粗略的搜索,但我并没有找到任何匹配的东西.

c++ text reflow word-wrap

5
推荐指数
1
解决办法
800
查看次数

如何防止在RedHat系统上安装SUSE RPM

我们有一个通过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",但我真的希望有比这更好的选项.

linux rpm rpmbuild

5
推荐指数
1
解决办法
536
查看次数

使用'set -x'调用时,为什么会得到不同的bash脚本结果,如何解决?

我发现我的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)

bash

5
推荐指数
1
解决办法
144
查看次数

如何确定rebase的分支父级

是的,这似乎非常类似于" 查找git分支的父分支 ",但我没有找到我的答案.

我想知道如何找到我当前的分支父母,但我可能会问错误的问题.所以我会提供我的方案.

  1. 我们的组织有几个长期运行的发布分支,不会重命名(但最终在发布后不推荐)

  2. 有时我会从其中一个发布分支创建一个功能分支来处理问题.这是一个本地特色分支.

  3. 我被叫去处理其他一些项目,其他一些发布等.

  4. 我回到这个功能,现在我想将它重新绑定到它最初分支的最新提交.但是已经过了足够的时间,我不记得这是从版本x或发布y分支出来的

那我该怎么做?在我看来,我以为我会弄清楚我创建了哪个发布分支,然后重新绑定到该分支上的最后一次提交.

我知道还有其他组织技术可以避免这个问题,比如总是在我的功能分支中包含基本分支的名称.但那艘船已经开航了.

git我遇到的挑战是否有解决方案?

git

5
推荐指数
2
解决办法
803
查看次数

对于普通用户,“身份验证失败,因为远程方已关闭传输流”

第三方供应商正在添加身份验证(耶!),但它并不总是对我们有用(嘘!)。

当 C# 应用程序以“管理员身份”运行时,它可以正常工作。但是,当应用程序作为普通(非管理员)用户运行时,它会失败并显示消息

“身份验证失败,因为远程方已关闭传输流”

我们明确设置为 TLS 1.2

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
Run Code Online (Sandbox Code Playgroud)

我们是

  • 执行 4.6 .NET C# WCF 客户端
  • 使用 HTTPS Web 服务
  • 使用TLS1.2
  • 在 Windows Server 2012 平台上

c# ssl wcf

2
推荐指数
1
解决办法
1万
查看次数

为什么模板化基类的方法不可见?

我有一个模板化的基类,提供方法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)

c++ templates

1
推荐指数
1
解决办法
84
查看次数

标签 统计

c++ ×7

c ×2

linux ×2

bash ×1

bjam ×1

boost ×1

c# ×1

class ×1

git ×1

ipc ×1

jam ×1

operator-overloading ×1

posix ×1

reflow ×1

root ×1

rpm ×1

rpmbuild ×1

serialization ×1

sockets ×1

ssl ×1

templates ×1

text ×1

wcf ×1

word-wrap ×1