小编Quu*_*one的帖子

Bash脚本在Ctrl + C上杀死背景(大)孩子

我有一个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)

bash shell kill process wait

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

为什么 Befunge 被认为难以编译?

Befunge 的设计目标之一是难以编译。然而,它很容易解释。可以用传统语言编写解释器,比如 C。要将 Befunge 程序翻译成等效的机器代码,可以将 Befunge 代码硬编码到 C 解释器中,并将生成的 C 程序编译为机器代码。或者“编译”是否意味着排除这种翻译的更受限制的东西?

interpreted-language compilation esoteric-languages befunge

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

ruamel.yaml 相当于 sort_keys?

我正在尝试使用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)

python ruamel.yaml

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

实现这个"错误,抛出"回调的最佳方法是什么?

请注意:在我们得到真正的问题之前,这里有很多背景信息.

我有一个相当宽的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)

c++ exception visitor template-meta-programming c++14

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

在 MSVC ABI 中,我如何可靠地找到仅给定 (void*) 的 vtable?

这个问题特别是关于非便携式 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 …

c++ msvcrt rtti visual-c++ vptr

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

提取NSString(在BMP之外)的第一个Unicode代码点的最简单方法?

由于历史原因,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 …

cocoa nsstring surrogate-pairs

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

为什么std :: fill使用ForwardIterator而不是OutputIterator?

(这个问题和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?我错过了什么?

c++ iterator stl

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

`std::pmr::monotonic_buffer_resource`:为什么是 `dynamic_cast`?

标准草案 N4618 是这样说的std::pmr::monotonic_buffer_resource

bool do_is_equal(const memory_resource& other) const noexcept override;
Run Code Online (Sandbox Code Playgroud)

返回: 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)

c++ dynamic-cast allocator c++17

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

为什么11 == 011返回false?

我很困惑我的程序输出:

#include<stdio.h>
int main()
{
    if(11==011)
        printf("True");
    else
        printf("False");
}
Run Code Online (Sandbox Code Playgroud)

输出是"False".

c c++ boolean

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

函数转换表示法 T(x) 和 static_cast&lt;T&gt;(x) 之间的区别

(我知道这与这里的其他一些问题非常相似,但我还没有找到任何具体的语言律师回答这个精确的细节。大多数接近重复的人只是问他们是否应该使用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)

任何类型有什么区别吗TU或者它们的效果 100% 相同吗?

如果它们不同,我会很欣赏标准库中与细微差异相关的地方的一些示例。(我的意思std::make_shared<T>(args...)是如何指定如何构造其对象,T(args...)而不是因为和那里T{args...}之间的细微差别。)T()T{}

c++ static-cast language-lawyer

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

如何在Befunge-93中编译程序?

如何在Befunge-93中保存和编译程序?保存文件需要什么文件扩展名(如fileName.what)?那怎么编译呢?

befunge

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

Kotlin:表达“`String?` 包含`String`”的最佳方式

可能只是Use of Boolean? 在 if 表达式中,但我对 Kotlin 了解不够,无法知道它是否是...

我想测试是否body : String?包含expected : String作为子字符串。(如果bodynull,那么它不包含子字符串。)我发现我可以这样写我的条件:

    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)对眼睛更容易?

readability kotlin

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