小编zwo*_*wol的帖子

发布C++资源和fork-exec?

我正在尝试使用fork-exec从我的C++项目中生成一个新进程.我正在使用fork-exec来创建子进程的双向管道.但是我担心分叉进程中的资源不会被正确释放,因为exec-call将完全接管我的进程并且不会调用任何析构函数.

我尝试通过抛出异常并在main的末尾从catch块调用execl来绕过这个,但是这个解决方案并没有破坏任何单例.

有没有明智的方法来安全地实现这一目标?(希望避免任何atExit黑客攻击)

例如:以下代码输出:

We are the child, gogo!
Parent proc, do nothing
Destroying object
Run Code Online (Sandbox Code Playgroud)

即使分叉进程也有一个单例的副本,在我调用execl之前需要对其进行破坏.

#include <iostream>
#include <unistd.h>

using namespace std;

class Resources
{
public:
    ~Resources() { cout<<"Destroying object\n"; }
};

Resources& getRes()
{
    static Resources r1;
    return r1;
}

void makeChild(const string &command)
{
    int pid = fork();
    switch(pid)
    {
    case -1:
        cout<<"Big error! Wtf!\n";
        return;
    case 0:
        cout<<"Parent proc, do nothing\n";
        return;
    }
    cout<<"We are the child, gogo!\n";
    throw command;
}

int main(int argc, char* argv[]) …
Run Code Online (Sandbox Code Playgroud)

c++ linux singleton exec

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

将字节值数组转换为base64编码的字符串并打破长行,Javascript(代码高尔夫)

这个JavaScript函数接受一个数字数组(在0-255范围内)并转换为base64编码的字符串,然后在必要时断开长行:

function encode(data)
{
  var str = "";
  for (var i = 0; i < data.length; i++)
    str += String.fromCharCode(data[i]);

  return btoa(str).split(/(.{75})/).join("\n").replace(/\n+/g, "\n").trim();
}
Run Code Online (Sandbox Code Playgroud)

你能用更少的代码做同样的事情吗?你能做到这样跑得更快吗?可移植性没有对象,如果你愿意,可以使用全新的语言功能,但必须使用JavaScript.

javascript firefox-addon

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

使用整数常量0初始化实例,但没有其他常量值或整数变量

我想定义一个类,其实例可以构造,隐式构造,或者从整数常量零分配,但不能从任何其他数字常量分配,而不是从具有整数类型的变量分配(即使它的值在运行时恰好为零) ).它也应该是同一类的其他实例的可复制构造.只要g ++ 4.6和MSVC 2010支持(在适当的模式下),就可以使用C++ 11功能.

具体地说,给定

class X { /* ... */ };
void fn(X);
Run Code Online (Sandbox Code Playgroud)

这些都应该编译:

X a(0);
X b = 0;
X c; c = 0;
X d = a;
X e; e = a;
fn(0);
Run Code Online (Sandbox Code Playgroud)

但这些不应该:

X f(1);
X g = 1;
X h; h = 1;
fn(1);

int ii = 23;
X a(ii);
X j = ii;
X k; k = ii;
fn(ii);
Run Code Online (Sandbox Code Playgroud)

我试过这个,但它不起作用:

class X {
public:
   X() {} 
   constexpr X(int v) { static_assert(v == …
Run Code Online (Sandbox Code Playgroud)

c++

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

禁止"程序无法启动因为X.dll丢失"错误弹出

我有一个Python程序,用于os.system执行各种命令.(它无法使用,subprocess因为它必须向后兼容Python 2.0.)

在Windows上,有时命令引用异常目录中的DLL,因此我得到臭名昭着的"程序无法启动因为X.dll缺失"错误弹出.

Windows错误弹出标题为

我的问题不是关于如何让命令找到它的所有DLL.我已经知道该怎么做了.我想知道的是,当DLL丢失时,如何告诉Windows 不显示此对话框?相反,子进程应该将错误消息打印到stderr(已被重定向到os.system调用中的文件)并退出失败(导致os.system返回错误代码).这样我的程序就可以捕获错误并以自己的方式报告,而不是挂起,直到有人来点击确定.

MSDN通常是我的朋友,但这次我得到的建议是如何处理特定缺失的DLL,这很好,但这次不是我需要的.

重申一下,这是一种极端向后兼容的情况:我需要一个适用于Python 2.7或任何旧版本的解决方案,直到2.0.它还需要适用于所有仍然流行的Windows版本(XP,Vista,7,8).使用更旧的 Windows是非常理想的,但不是100%要求.此外,不能选择使用任何其他语言编写的第三方模块和帮助程序.(我想一个.BAT文件可以,如果这是唯一的方法.)

python windows cmd

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

仅使用整数常量表达式计算sqrt(SIZE_MAX + 1),以满足奇怪的ABI

OpenBSD的C库有一个名为reallocarray(3)的扩展realloc(array, size*nmemb),如果乘法溢出,它就不会爆炸. 该实现包含此片段:

/*
 * This is sqrt(SIZE_MAX+1), as s1*s2 <= SIZE_MAX
 * if both s1 < MUL_NO_OVERFLOW and s2 < MUL_NO_OVERFLOW
 */
#define MUL_NO_OVERFLOW (1UL << (sizeof(size_t) * 4))
Run Code Online (Sandbox Code Playgroud)

在Programmers.SE上,该计算的修改版本因技术错误而受到谴责. 4显然应该是CHAR_BIT/2,但这不是唯一的问题.假设一个不常见的ABI,其中size_t有填充位.(这并非荒谬地令人难以置信:考虑一个具有32位寄存器但具有24位地址空间的微控制器.)然后SIZE_MAX小于1 << (sizeof(size_t)*CHAR_BIT)[在无限精度算术中]并且计算错误.

所以,问题:你能否floor(sqrt(SIZE_MAX+1))仅使用C99整数常数表达式算法进行计算,除了C99要求以及你可以从中学到什么之外,不做任何关于ABI的假设<limits.h>?注意,SIZE_MAX可能相等UINTMAX_MAX,即可能没有任何类型可以表示SIZE_MAX+1没有溢出.

编辑:认为 SIZE_MAX需要为2 ñ  - 1为正整数Ñ,但必然是形式2的2n个  - 1 -考虑S/390中,一个其的的ABI有一个31位的地址空间.因此:如果sqrt(SIZE_MAX+1) …

c portability integer-arithmetic

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

invisible()返回的对象什么时候不可见?

?invisible

返回对象的(临时)不可见副本.

这个括号内意味着隐形不会永远存在,但我找不到任何可以解释它何时消失的东西.我特别想知道像这样的结构(来自我的这个旧答案):

printf <- function(...) invisible(print(sprintf(...)))
Run Code Online (Sandbox Code Playgroud)

其中外部invisible可能是不必要的(因为print已经标明其返回值不可见的). withVisible()报告说这个函数的返回值在任何一种情况下都是不可见的,但我不知道这是否由语言保证,或者只是它在当前实现中的工作方式.

r language-lawyer

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

iostreams - 将`wchar_t`或`charXX_t`值打印为字符

如果将a wchar_t,char16_tchar32_t值提供给狭窄的ostream,它将打印代码点的数值.

#include <iostream>
using std::cout;
int main()
{
    cout << 'x' << L'x' << u'x' << U'x' << '\n';
}
Run Code Online (Sandbox Code Playgroud)

打印x120120120.这是因为有一个与它operator<<的特定组合,但是对于其他字符类型没有类似的运算符,所以它们以这种方式静默转换和打印.类似地,非窄字符串(,,)将被默默地转换为与打印为指针值,和非窄字符串对象(,,)甚至不会编译.basic_ostreamcharTintL"x"u"x"U"X"void*wstringu16stringu32string

因此,问题:什么是打印最少可怕的方式wchar_t,char16_tchar32_t在一个狭窄的ostream值,作为字符,而不是作为码点的数值?它应该正确地将在ostream的编码中可表示的所有代码点转换为该编码,并且应该在代码点不可表示时报告错误.(例如,给定u'…'和UTF-8 ostream,应将三字节序列0xE2 0x80 0xA6写入流;但是给定u'â'和KOI8-R ostream,应报告错误.)

同样,如何在狭窄的ostream上打印非窄C字符串或字符串对象,转换为输出编码?

如果在ISO C++ 11中无法做到这一点,我将采用特定于平台的答案.

(灵感来自这个问题.)

c++ iostream widechar

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

从python中的对数正态分布生成随机数

我需要从Python中的对数正态分布生成伪随机数.问题是我从对数正态分布模式和标准偏差开始.我没有对数正态分布的均值或中值,也没有基础正态分布的任何参数.

numpy.random.lognormal取基础正态分布的均值和标准差.我试图从我的参数计算这些,但最后用四次函数.它有一个解决方案,但我希望有一个更简单的方法来做到这一点.

scipy.stats.lognorm采取我不理解的参数.我不是母语为英语的人,文档没有意义.

你能帮我吗?

python numpy scipy

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

PEP8-E129和E127 / E128之间的矛盾

根据PEP标准,缩进应该在二进制运算符之前。此外,多行条件应放在括号内,以避免在换行符前使用反斜杠。这两个约定导致以下情况

if (long_condition_1
    or long_condition_2):
    do_some_function()
Run Code Online (Sandbox Code Playgroud)

该代码反过来E129 visually indented line with same indent as next logical line在PEP8中中断。但是,第二行必须缩进四个空格,否则,对于缩进或缩进过的行,它会破坏E128或E127。

如何格式化上面的一种,使其符合PEP8标准?

python coding-style pep8

6
推荐指数
2
解决办法
1280
查看次数

嵌入 CPython:如何构造 Python 可调用对象来包装 C 回调指针?

假设我将 CPython 解释器嵌入到一个用 C 编写的较大程序中。该程序的 C 组件偶尔需要调用用 Python 编写的函数,并将回调函数作为参数提供给它们。

使用 CPython扩展和嵌入API,如何构造一个包装 C 函数指针的 Python“可调用”对象,以便我可以将该对象传递给 Python 代码并让 Python 代码成功回调到 C 代码中?

注意:这是最初由用户dhanasubbu发布的问题的修订版本,我回答了该问题,但随后被删除。我认为这实际上是一个好问题,所以我将我所写的内容转换为我自己对问题的陈述的自我回答。欢迎其他答案。

c python cpython python-c-api

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