小编Tho*_*mas的帖子

如何在python中获得单调持续时间?

我想记录真实壁挂时间有多长.目前我这样做:

startTime = time.time()
someSQLOrSomething()
print "That took %.3f seconds" % (time.time() - startTime)
Run Code Online (Sandbox Code Playgroud)

但是如果在SQL查询(或其他任何东西)运行时调整时间,则会失败(产生不正确的结果).

我不想只是对它进行基准测试.我想在实时应用程序中记录它,以便查看实时系统的趋势.

我想要像clock_gettime(CLOCK_MONOTONIC,...)这样的东西,但是在Python中.并且最好不必编写调用clock_gettime()的C模块.

python linux benchmarking clock

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

C++ 11:我可以从多个args转到元组,但是我可以从元组转到多个args吗?

可能重复:
如何将元组扩展为可变参数模板函数的参数?
"解包"一个元组来调用匹配的函数指针

在C++ 11模板中,有没有办法将元组用作(可能是模板)函数的各个args?

示例:
假设我有此功能:

void foo(int a, int b)  
{  
}
Run Code Online (Sandbox Code Playgroud)

我有元组auto bar = std::make_tuple(1, 2).

我可以用它以foo(1, 2)一种模板的方式打电话吗?

我的意思并不简单,foo(std::get<0>(bar), std::get<1>(bar))因为我想在一个不知道args数量的模板中这样做.

更完整的例子:

template<typename Func, typename... Args>  
void caller(Func func, Args... args)  
{  
    auto argtuple = std::make_tuple(args...);  
    do_stuff_with_tuple(argtuple);  
    func(insert_magic_here(argtuple));  // <-- this is the hard part  
}
Run Code Online (Sandbox Code Playgroud)

我应该注意,我宁愿不创建一个适用于一个arg的模板,另一个适用于两个arg的模板等等...

c++ templates variadic-templates c++11

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

我真的不能发送带有客户端ID的开源软件吗?

开发人员凭据(例如密码,密钥和客户端ID)旨在供您使用并标识您的API客户端.您将保密您的凭据并做出合理的努力来防止和阻止其他API客户端使用您的凭据.开发人员凭据可能未嵌入开源项目中.

(https://developers.google.com/terms/,我的重点)

这是否意味着我的开源驱动器命令行客户端需要强制我的软件的每个用户在Google云端控制台中设置一个新项目?有更好的选择吗?

它不是很难从非开源中提取客户端ID和客户端"秘密",为什么区别呢?

"安装应用程序"客户端ID和机密并不是真正的秘密,Google文档似乎同意:

该过程会生成客户端ID,在某些情况下会导致客户端机密,您将其嵌入应用程序的源代码中.(在这种情况下,客户端秘密显然不被视为秘密.)

(https://developers.google.com/accounts/docs/OAuth2,我的重点)

open-source oauth google-api clientid google-oauth

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

如何返回不可移动(但可复制)的对象?

编辑:结束目标:我想创建一个永远不会使用移动的容器类,即使它可用.NonMove是该容器的一类测试对象.

我尝试了不同的变化,但GCC坚持要使用移动.

class NonMove {
 public:
  NonMove() {}

  // Copy.
  NonMove(const NonMove&) {}
  NonMove& operator=(const NonMove&) {}

  // Move
  NonMove(NonMove&&) = delete;
  NonMove& operator=(NonMove&&) = delete;
};

NonMove foo() {
  return NonMove();
}
Run Code Online (Sandbox Code Playgroud)

使用-std = gnu ++ 11时GCC 4.9.1出错

move.cc: In function ‘NonMove foo()’:
move.cc:15:18: error: use of deleted function ‘NonMove::NonMove(NonMove&&)’
   return NonMove();
                  ^
move.cc:10:3: note: declared here
   NonMove(NonMove&&) = delete;
   ^
Run Code Online (Sandbox Code Playgroud)

c++ move

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

我该如何防范硬链接攻击?

  • 我想将数据附加到/ tmp中的文件.
  • 如果文件不存在,我想创建它
  • 我不在乎别人是否拥有该文件.数据并不是秘密.
  • 我不希望有人能够在其他地方或其他文件中进行竞争.

做这个的最好方式是什么?

这是我的想法:

fd = open("/tmp/some-benchmark-data.txt", O_APPEND | O_CREAT | O_NOFOLLOW | O_WRONLY, 0644);
fstat(fd, &st);
if (st.st_nlink != 1) {
    HARD LINK ATTACK!
}
Run Code Online (Sandbox Code Playgroud)

问题:有人可以将文件链接到我的一些短期文件,因此/tmp/some-benchmark-data.txt与我的另一个脚本正在使用的/ tmp/tmpfileXXXXXX相同(并使用正确的方式打开) O_EXCL和所有这些).然后我的基准数据被附加到这个/ tmp/tmpfileXXXXXX文件,而它仍然被使用.

如果我的其他脚本碰巧打开了它的临时文件,那么删除它,然后使用它; 然后我的基准数据会破坏该文件的内容.然后,这个其他脚本必须在上面代码的open()和fstat()之间删除它的文件.

换句话说:

This script          Dr.Evil        My other script or program
                                    open(fn2, O_EXCL | O_CREAT | O_RDWR)
                     link(fn1,fn2)
open(fn1, ...)
                                     unlink(fn2)
fstat(..)=>link is 1
write(...)
close(...)
                                    write(...)
                                    seek(0, ...)
                                    read(...) => (maybe) WRONG DATA!
Run Code Online (Sandbox Code Playgroud)

因此上述解决方案不起作用.很可能还有其他攻击.

什么是正确的方法?除了不使用世界可写目录.

编辑:为了防止恶意用户使用他/她的所有权和权限创建文件,或者只是错误的权限(通过硬链接文件然后删除原始文件,或硬链接你的短文件)我可以在nlink检查后检查所有权和权限位.

没有安全问题,但也可以避免意外.最糟糕的情况是,我从我的其他文件复制的文件的开头得到了一些我自己的数据(来自另一个文件).

编辑2:我认为几乎不可能防止有人将名称硬链接到打开,删除然后使用的文件.例如EXE打包程序,有时甚至可以通过/ proc/pid/fd-num执行删除的文件.与此竞争会导致打包程序的执行失败.lsof可能会发现是否有其他人打开了inode,但它似乎比它的价值更麻烦.

c linux security

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

模板生成一百个C回调函数,编译不慢

我需要将一百个回调函数的顺序传递给 C 库。我所有的回调都非常相似,只是他们需要知道它注册的是哪个“密钥”。C API 不允许传回上下文。

换句话说,这是 API:

void register_for_event(int event_type, void(*callback)());
Run Code Online (Sandbox Code Playgroud)

我想出了这个模板元编程:

template<int event_type>
void event_handler() {
  std::cout << "Event: " << event_type << std::endl;
}

template <int n = 100>
void register_event_handlers() {
  register_for_event(n, event_handler<n>);
  register_event_handlers<n-1>();
}
template<> void register_event_handlers<0>(){}
Run Code Online (Sandbox Code Playgroud)

但是有没有办法写这个:

  • 更容易阅读
  • 编译速度更快(上面增加了几秒钟来构建文件,使用 gcc)

任何版本的 C++,直到 C++20,都适合我。

我正在尝试避免使用宏,尽管我不清楚宏在这里有何帮助。

我可以使用 shell 脚本生成代码。如果我找不到更好的 C++ 原生方式,我可能最终会这样做。但我也对其他可能的本机 C++ 方式感兴趣。

c++ templates template-meta-programming

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

如何防止自动工具自动重新生成配置脚本?

有时由于SCM没有严格记住文件的时间戳,生成的Makefile会认为它需要重新运行"autoreconf -i"或相当于从Makefile.am重新生成Makefile.in,从configure.ac配置等等..

我该如何防止这种情况?

我想阻止它,因为它会导致这些问题:

  • 在创建dist存档(git archive --format = tar ...)时,时间戳将不正确,最终用户将面临问题.不酷.
  • 在慢速系统上,这会使编译花费更长时间,因为它不再是configure,make,make install,而是configure,autoreconf -i,configure,make make install.

我知道我可以在制作dist tarball之前"触摸"生成的文件,但在我看来,这只能解决tarball的问题,而不是开发人员.这也是一个丑陋的黑客,解决一个应该关闭的错误.此外,它打破了git存档,因为无论如何时间戳并不总是正确的.

其他SCM也有这个,所以问题不是(IMO)与git.

git autotools

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

_XPG4_2和其他定义如何在Solaris上运行?

在Solaris上,为了获取struct msghdr中的msg_control字段并具有IPV6_TCLASS,我似乎需要定义_XPG4_2和__EXTENSIONS__.

如果我在包含任何东西之前将它们定义为1,它似乎有效:

#if defined (__SVR4) && defined (__sun)
# define _XPG4_2 1
# define __EXTENSIONS__ 1
#endif
Run Code Online (Sandbox Code Playgroud)
  1. 我应该这样做吗?
  2. 我是否需要在所有源文件中定义它们,否则可能会发生不好的事情?
  3. 某处有这些东西的清单吗?

这与这个问题有关.

c sockets solaris network-programming

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

处理字典或循环参数?

我什么时候应该使用进程范围的字典?何时我的进程状态应该在循环函数的参数中?

这个:

loop() ->
  receive
     {From, subscribe} ->
       put(listeners, [From|get(listeners)]),
       ?MODULE:loop()
  end.
Run Code Online (Sandbox Code Playgroud)

或这个:

loop(Listeners) ->
  receive
    {From, subscribe} ->
       ?MODULE:loop([From|Listeners])
  end.
Run Code Online (Sandbox Code Playgroud)

循环函数的参数具有明确的好处,因为它之外的任何东西都不能改变参数(除非你在另一个函数上做奇怪的魔法弹跳,比如蹦床),但是状态倾向于加起来,以及它们的参数.

如何将dict作为参数?这两个世界中最好的还是最差的?

erlang

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

使用openmp并行for_each

为什么这个代码在与std :: sort()完全正常工作时不会并行化std :: for_each()?

我如何解决它?

g++ -fopenmp -D_GLIBCXX_PARALLEL=1 -o p p.cc && time ./p  sort
Run Code Online (Sandbox Code Playgroud)

Linux上的GCC 4.3.

#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>

void delay()
{
        for(int c = 0; c < 1000000; c++) {
    }
}

int lt(int a, int b)
{
        delay();
        return a < b;
}

void noop(int a)
{
    delay();
}

int main(int argc, char **argv)
{
        if (argc < 2) {
                printf("%s  <sort | for_each>\n", argv[0]);
                return 1;
    }

        std::vector<int> foo(10000);

        if …
Run Code Online (Sandbox Code Playgroud)

c++ parallel-processing openmp

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

为什么不能将临时作为参数发送到C++中的函数?

这有效:

class Foo {};
void external_function(Foo&);
void f() {
  Foo b;                                                                                                                                         
  external_function(b);                                                                                                                          
}
Run Code Online (Sandbox Code Playgroud)

这不是:

class Foo {};
void external_function(Foo&);
void f() {
  external_function(Foo());
}
Run Code Online (Sandbox Code Playgroud)

Clang说:

aac.cc:3:6: note: candidate function not viable: no known conversion from 'Derived' to 'Base &' for 1st argument;
Run Code Online (Sandbox Code Playgroud)

GCC实际上更有帮助:

aac.cc:7:30: error: invalid initialisation of non-const reference of type ‘Base&’ from an rvalue of type ‘Derived’
Run Code Online (Sandbox Code Playgroud)

Herb Sutter(http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/)表示非const引用不能用于rvalues,这在他的例子中是有意义的,但不在我的,因为对象在external_function()调用的持续时间内存在,不是吗?

我知道如何使它发挥作用; 只需创建一个命名对象,使其不是右值(如上所述),或使用const ref.但我想知道为什么不允许这样做,因为它对我来说似乎是安全的.

c++ reference

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