我有一个Bash脚本(Bash 3.2,Mac OS X 10.8),它可以并行调用多个Python脚本,以便更好地利用多个内核.每个Python脚本都需要很长时间才能完成.
问题是,如果我在Bash脚本中间按Ctrl + C,Python脚本实际上不会被杀死.如何编写Bash脚本以便杀死它也会杀死所有后台子节点?
这是我原来的"简化测试案例".不幸的是,我似乎已经减少了太多,以至于它不再表现出问题; 我的错.
set -e
cat >work.py <<EOF
import sys, time
for i in range(10):
time.sleep(1)
print "Tick from", sys.argv[1]
EOF
function process {
python ./work.py $1 &
}
process one
process two
wait
Run Code Online (Sandbox Code Playgroud)
这是一个完整的测试用例,仍然大大减少,但希望这个将证明问题.它在我的机器上再现......但是,两天前,我认为我的机器上再现了旧的测试用例,今天它肯定没有.
#!/bin/bash -e
set -x
cat >work.sh <<EOF
for i in 0 1 2 3 4 5 6 7 8 9; do
sleep 1; echo "still going"
done
EOF
chmod +x work.sh
function kill_all_jobs { jobs -p …Run Code Online (Sandbox Code Playgroud) Befunge 的设计目标之一是难以编译。然而,它很容易解释。可以用传统语言编写解释器,比如 C。要将 Befunge 程序翻译成等效的机器代码,可以将 Befunge 代码硬编码到 C 解释器中,并将生成的 C 程序编译为机器代码。或者“编译”是否意味着排除这种翻译的更受限制的东西?
我正在尝试使用ruamel.yaml. 我熟悉json模块的界面,在那里漂亮地打印一个 dict 就像
import json
with open('outfile.json', 'w') as f:
json.dump(mydict, f, indent=4, sort_keys=True)
Run Code Online (Sandbox Code Playgroud)
有了ruamel.yaml,我已经到了
import ruamel.yaml
with open('outfile.yaml', 'w') as f:
ruamel.yaml.round_trip_dump(mydict, f, indent=2)
Run Code Online (Sandbox Code Playgroud)
但它似乎不支持该sort_keys选项。似乎ruamel.yaml也没有任何详尽的文档,并且在 Google 上搜索“ruamel.yaml sort”或“ruamel.yaml字母化”并没有达到我期望的简单程度。
是否有一个或两个班轮用于漂亮地打印带有排序键的 YAML 文件?
(请注意,我需要在整个容器中递归地将键按字母顺序排列;仅按字母顺序排列顶层是不够的。)
请注意,如果我使用round_trip_dump,则键不会排序;如果我使用safe_dump,则输出不是“YAML 风格”(或更重要的是“Kubernetes 风格”)YAML。我不想要[]或{}在我的输出中。
$ pip freeze | grep yaml
ruamel.yaml==0.12.5
$ python
>>> import ruamel.yaml
>>> mydict = {'a':1, 'b':[2,3,4], 'c':{'a':1,'b':2}}
>>> print ruamel.yaml.round_trip_dump(mydict) # …Run Code Online (Sandbox Code Playgroud) 请注意:在我们得到真正的问题之前,这里有很多背景信息.
我有一个相当宽的C++类层次结构(表示类似不同类型的表达式):
class BaseValue { virtual ~BaseValue(); };
class IntValue final : public BaseValue { int get() const; };
class DoubleValue final : public BaseValue { double get() const; };
class StringValue final : public BaseValue { std::string get() const; };
Run Code Online (Sandbox Code Playgroud)
而另一方面,我有办法强制用户的输入到预期的类型:
class UserInput { template<class T> get_as() const; };
Run Code Online (Sandbox Code Playgroud)
因此,编写匹配器的一种方法是"用户的输入是否等于此BaseValue的值?" - 会是这样的:
class BaseValue { virtual bool is_equal(UserInput) const; };
class IntValue : public BaseValue {
int get() const;
bool is_equal(UserInput u) const override {
return u.get_as<int>() == get(); …Run Code Online (Sandbox Code Playgroud) 这个问题特别是关于非便携式 MSVC ABI 的东西。
我正在尝试typeid用明显不可移植但又不神奇的 C++编写等效的C++。对于 Itanium ABI(在 Linux/Mac 上使用),它非常简单:
const std::type_info& dynamicast_typeid(void *mdo)
{
std::type_info **vptr = *reinterpret_cast<std::type_info ***>(mdo);
std::type_info *typeinfo_ptr = vptr[-1];
return *typeinfo_ptr;
}
Run Code Online (Sandbox Code Playgroud)
所以现在我正在查看 64 位 MSVC ABI,并且该死的,我被难住了。对于非常简单的类,那些以 vfptr 开头的偏移量为 0 的类,它几乎和 Itanium 一样简单:
const std::type_info& dynamicast_typeid(void *mdo)
{
int *rtti_complete_object_locator = ((int ***)mdo)[0][-1];
char *result = (char *) rtti_complete_object_locator;
result -= rtti_complete_object_locator[5];
result += rtti_complete_object_locator[3];
return *(std::type_info*)result;
}
Run Code Online (Sandbox Code Playgroud)
(此代码基于Wine 项目的__RTtypeid.)
问题是某些 C++ 类不是以偏移量 0 处的 vfptr 开头!有时它们以 vbptr …
由于历史原因,Cocoa的Unicode实现是16位的:它0xFFFF通过“代理对” 处理上述Unicode字符。这意味着以下代码将无法正常工作:
NSString myString = @"";
uint32_t codepoint = [myString characterAtIndex:0];
printf("%04x\n", codepoint); // incorrectly prints "d842"
Run Code Online (Sandbox Code Playgroud)
现在,此代码在100%的时间内都有效,但是它太冗长了:
NSString myString = @"";
uint32_t codepoint;
[@"" getBytes:&codepoint maxLength:4 usedLength:nil
encoding:NSUTF32StringEncoding options:0
range:NSMakeRange(0,2) remainingRange:nil];
printf("%04x\n", codepoint); // prints "20d20"
Run Code Online (Sandbox Code Playgroud)
并且此代码使用mbtowc有效,但仍然很冗长,影响全局状态,不是线程安全的,并且可能在所有这些之上填充了自动释放池:
setlocale(LC_CTYPE, "UTF-8");
wchar_t codepoint;
mbtowc(&codepoint, [@"" UTF8String], 16);
printf("%04x\n", codepoint); // prints "20d20"
Run Code Online (Sandbox Code Playgroud)
Is there any simple Cocoa/Foundation idiom for extracting the first (or Nth) Unicode codepoint from an NSString? Preferably a one-liner that …
(这个问题和std :: max_element为什么需要一个ForwardIterator有相同的"问题模板" ?但答案必须不同,因为std::fill不会将迭代器返回到输出序列.)
std::fill被定义为仅在输出范围由一对ForwardIterators给出时才起作用.但是,表面上类似的std::fill_n工作与OutputIterator很好.
当然算法很简单
template<class OutIt, class T>
void fill(OutIt first, OutIt last, T value)
{
while (first != last) {
*first = value;
++first;
}
}
Run Code Online (Sandbox Code Playgroud)
这个算法怎么样需要ForwardIterator?我错过了什么?
标准草案 N4618 是这样说的std::pmr::monotonic_buffer_resource:
Run Code Online (Sandbox Code Playgroud)bool do_is_equal(const memory_resource& other) const noexcept override;返回:
this == dynamic_cast<const monotonic_buffer_resource*>(&other)
换句话说,标准不只是将指针与 进行比较,而是this == &rhs希望供应商不遗余力地使用dynamic_cast右手指针。
我想不出任何理智的情况dynamic_cast会改变比较的结果。不过,我可以想到一些疯狂的案例:
class new_delete_memory_resource : public memory_resource {
void *do_allocate(size_t bytes, size_t align) override {
return ::operator new(bytes, align);
}
void *do_deallocate(void *p, size_t bytes, size_t align) override {
::operator delete(p, bytes, align);
}
bool do_is_equal(const memory_resource& rhs) const noexcept override {
return (this == &rhs);
}
};
class TwoHeadedResource …Run Code Online (Sandbox Code Playgroud) 我很困惑我的程序输出:
#include<stdio.h>
int main()
{
if(11==011)
printf("True");
else
printf("False");
}
Run Code Online (Sandbox Code Playgroud)
输出是"False".
(我知道这与这里的其他一些问题非常相似,但我还没有找到任何具体的语言律师回答这个精确的细节。大多数接近重复的人只是问他们是否应该使用static_cast功能风格强制转换(答案:是),或者C 风格static_cast强制转换之间的区别。)
在 C++ 中,以下两个强制转换看起来非常相似:
template<class T, class U> auto convert1(U&& u) {
return T( std::forward<U>(u) );
}
template<class T, class U> auto convert2(U&& u) {
return static_cast<T>( std::forward<U>(u) );
}
Run Code Online (Sandbox Code Playgroud)
任何类型有什么区别吗T?U或者它们的效果 100% 相同吗?
如果它们不同,我会很欣赏标准库中与细微差异相关的地方的一些示例。(我的意思std::make_shared<T>(args...)是如何指定如何构造其对象,T(args...)而不是因为和那里T{args...}之间的细微差别。)T()T{}
如何在Befunge-93中保存和编译程序?保存文件需要什么文件扩展名(如fileName.what)?那怎么编译呢?
这可能只是Use of Boolean? 在 if 表达式中,但我对 Kotlin 了解不够,无法知道它是否是...
我想测试是否body : String?包含expected : String作为子字符串。(如果body是null,那么它不包含子字符串。)我发现我可以这样写我的条件:
if (body?.contains(expected) == true) {
succeed()
}
Run Code Online (Sandbox Code Playgroud)
或者像这样:
if (body?.contains(expected) != true) {
fail()
}
Run Code Online (Sandbox Code Playgroud)
(body?.contains(expected)type 的表达式在哪里Boolean?),但这真的是编写这种条件的最佳或最惯用的方式吗?是否有任何替代方案(可能使用 的其他成员函数String)对眼睛更容易?
c++ ×6
befunge ×2
allocator ×1
bash ×1
boolean ×1
c ×1
c++14 ×1
c++17 ×1
cocoa ×1
compilation ×1
dynamic-cast ×1
exception ×1
iterator ×1
kill ×1
kotlin ×1
msvcrt ×1
nsstring ×1
process ×1
python ×1
readability ×1
rtti ×1
ruamel.yaml ×1
shell ×1
static-cast ×1
stl ×1
visitor ×1
visual-c++ ×1
vptr ×1
wait ×1