我正在尝试使用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) 这个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.
我想定义一个类,其实例可以构造,隐式构造,或者从整数常量零分配,但不能从任何其他数字常量分配,而不是从具有整数类型的变量分配(即使它的值在运行时恰好为零) ).它也应该是同一类的其他实例的可复制构造.只要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) 我有一个Python程序,用于os.system执行各种命令.(它无法使用,subprocess因为它必须向后兼容Python 2.0.)
在Windows上,有时命令引用异常目录中的DLL,因此我得到臭名昭着的"程序无法启动因为X.dll缺失"错误弹出.

我的问题不是关于如何让命令找到它的所有DLL.我已经知道该怎么做了.我想知道的是,当DLL丢失时,如何告诉Windows 不显示此对话框?相反,子进程应该将错误消息打印到stderr(已被重定向到os.system调用中的文件)并退出失败(导致os.system返回错误代码).这样我的程序就可以捕获错误并以自己的方式报告,而不是挂起,直到有人来点击确定.
MSDN通常是我的朋友,但这次我得到的建议是如何处理特定缺失的DLL,这很好,但这次不是我需要的.
重申一下,这是一种极端向后兼容的情况:我需要一个适用于Python 2.7或任何旧版本的解决方案,直到2.0.它还需要适用于所有仍然流行的Windows版本(XP,Vista,7,8).使用更旧的 Windows是非常理想的,但不是100%要求.此外,不能选择使用任何其他语言编写的第三方模块和帮助程序.(我想一个.BAT文件可以,如果这是唯一的方法.)
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) …
?invisible 说
返回对象的(临时)不可见副本.
这个括号内意味着隐形不会永远存在,但我找不到任何可以解释它何时消失的东西.我特别想知道像这样的结构(来自我的这个旧答案):
printf <- function(...) invisible(print(sprintf(...)))
Run Code Online (Sandbox Code Playgroud)
其中外部invisible是可能是不必要的(因为print已经标明其返回值不可见的). withVisible()报告说这个函数的返回值在任何一种情况下都是不可见的,但我不知道这是否由语言保证,或者只是它在当前实现中的工作方式.
如果将a wchar_t,char16_t或char32_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_t或char32_t在一个狭窄的ostream值,作为字符,而不是作为码点的数值?它应该正确地将在ostream的编码中可表示的所有代码点转换为该编码,并且应该在代码点不可表示时报告错误.(例如,给定u'…'和UTF-8 ostream,应将三字节序列0xE2 0x80 0xA6写入流;但是给定u'â'和KOI8-R ostream,应报告错误.)
同样,如何在狭窄的ostream上打印非窄C字符串或字符串对象,转换为输出编码?
如果在ISO C++ 11中无法做到这一点,我将采用特定于平台的答案.
(灵感来自这个问题.)
我需要从Python中的对数正态分布生成伪随机数.问题是我从对数正态分布的模式和标准偏差开始.我没有对数正态分布的均值或中值,也没有基础正态分布的任何参数.
numpy.random.lognormal取基础正态分布的均值和标准差.我试图从我的参数计算这些,但最后用四次函数.它有一个解决方案,但我希望有一个更简单的方法来做到这一点.
scipy.stats.lognorm采取我不理解的参数.我不是母语为英语的人,文档没有意义.
你能帮我吗?
根据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标准?
假设我将 CPython 解释器嵌入到一个用 C 编写的较大程序中。该程序的 C 组件偶尔需要调用用 Python 编写的函数,并将回调函数作为参数提供给它们。
使用 CPython扩展和嵌入API,如何构造一个包装 C 函数指针的 Python“可调用”对象,以便我可以将该对象传递给 Python 代码并让 Python 代码成功回调到 C 代码中?
注意:这是最初由用户dhanasubbu发布的问题的修订版本,我回答了该问题,但随后被删除。我认为这实际上是一个好问题,所以我将我所写的内容转换为我自己对问题的陈述的自我回答。欢迎其他答案。
python ×4
c++ ×3
c ×2
cmd ×1
coding-style ×1
cpython ×1
exec ×1
iostream ×1
javascript ×1
linux ×1
numpy ×1
pep8 ×1
portability ×1
python-c-api ×1
r ×1
scipy ×1
singleton ×1
widechar ×1
windows ×1