在我的Linux机器上,sig_atomic_t是一个普通的老int.是否ints具有特殊的原子质量?
$ gcc -v
Using built-in specs.
Target: x86_64-linux-gnu
...
Thread model: posix
gcc version 4.3.2 (Debian 4.3.2-1.1)
$ echo '#include <signal.h>' | gcc -E - | grep atomic
typedef int __sig_atomic_t;
typedef __sig_atomic_t sig_atomic_t;
Run Code Online (Sandbox Code Playgroud) 我刚刚发现有人正在调用 - 从信号处理程序 - 一个绝对不是我编写的异步信号安全函数.
所以,现在我很好奇:如何避免这种情况再次发生?我希望能够轻松确定我的代码是否在信号处理程序上下文中运行(语言是C,但解决方案不适用于任何语言吗?):
int myfunc( void ) {
if( in_signal_handler_context() ) { return(-1) }
// rest of function goes here
return( 0 );
}
Run Code Online (Sandbox Code Playgroud)
这是在Linux下.希望这不是一个简单的答案,否则我会觉得自己像个白痴.
Prolog:我在文档中错过了这个,我是个白痴
cmake的-2.8.10.2
安装目录时如何使cmake保留原始文件权限?对于手头的项目,我希望它基本上将一些目录从我的源代码树复制到安装树.以机智:
install(
DIRECTORY config runp
DESTINATION ${CMAKE_INSTALL_PREFIX}
PATTERN ".svn" EXCLUDE
PATTERN ".git" EXCLUDE
PATTERN "start_collection.snl" EXCLUDE
)
Run Code Online (Sandbox Code Playgroud)
所有工作都按预期工作 - 除了使用不正确的文件权限复制可执行脚本.实际上,没有保留原始文件权限.使用FILE_PERMISSIONS和DIRECTORY_PERMISSIONS全局设置权限是我不想做的事情,坦率地说,在这种情况下会是一个黑客.
在shell脚本世界中,我会做一些像这样简单的事情:
for i in config runp ; do
tar cf - $i | tar -C $CMAKE_INSTALL_PREFIX -xf -
done
Run Code Online (Sandbox Code Playgroud) 编辑:Prolog:我是我自己的无知和深夜编码的受害者.
我正在使用模板模板编写模板化的类.它有一个迭代器,这意味着我需要提供一个适当的模板operator==().这是我遇到麻烦的地方.
代表性代码示例如下:
#include <iostream>
#include <typeinfo>
using namespace std;
namespace detail {
template <typename T> class foo {};
template <typename T> class bar {};
}
template <template<class> class A, template<class> class B>
struct basic_thing {
template <typename T> using target_type = A<B<T>>;
target_type<float> fmember;
target_type<int> imember;
struct iterator {
bool equal (const iterator& other) { return true; }
};
iterator begin () { return iterator{}; }
iterator end () { return iterator{}; }
};
template <template<class> …Run Code Online (Sandbox Code Playgroud)