我的编译命令是在macOS Seria clang -std=c11 -g -Wall -Werror -fsanitize=address -file.c -o file
编译之后,它还生成一个额外的file.dSYM文件,其中包含所有调试sybols.但是,当我使用WSL或其他*nix系统时,它不会生成这样的文件,调试符号被嵌入到可执行二进制文件中.所以我只是想知道有没有办法在macOS中用clang做同样的事情.
在对最近一个问题的评论过程中,出现了一个附属问题,即在什么时候PTHREAD_CANCEL_DEFERRED可以预期对具有可取消性的pthreads线程的取消请求采取行动.随后提到了标准和一些律师.我并不太关心我在这个问题的评论中是否错了,但我想确定我正确理解POSIX的规定.
标准中最相关的部分说
每当线程启用了可取消性并且已经以该线程作为目标取消请求,然后线程调用任何作为取消点的函数时,取消请求将在函数返回之前被执行.如果线程已启用可取消性并且在线程作为目标进行取消请求,而线程在取消点处被挂起,则线程应被唤醒并且应取消取消请求.
但是,线程被"暂停"是什么意思呢?POSIX明确定义了进程的术语,但就我所知,对于线程没有明确定义.另一方面,POSIX将线程暂停作为少数函数的行为之一,包括但不限于与同步对象相关的一些函数.是否应该得出结论认为那些集体作为该术语的相关定义?
而作为这一切都涉及到因为POSIX不指定线程挂起作为行为的一部分催生了这一调查线索的问题,read(),fread()或任何一般的文件或流I/O功能,如果一个线程是赚不到由于I/O被阻止而导致进展,这是否意味着为了取消而被"暂停"?
也许我正在过度思考这个问题,因为它似乎应该更加容易.我想获取int类型的值,例如fgetc()返回的值,如果它不是文件结束代码,则将其记录在char缓冲区中.例如:
char buf;
int c = fgetc(stdin);
if (c < 0) {
/* handle end-of-file */
} else {
buf = (char) c; /* not quite right */
}
Run Code Online (Sandbox Code Playgroud)
但是,如果平台已经签署了默认字符,那么fgetc()返回的值可能超出了char的范围,在这种情况下,将其转换或赋值给(signed)char会产生实现定义的行为(对吗?).当然,那里有大量的代码完全相当于这个例子.是否完全依赖于实现定义的行为和/或假设7位数据?
在我看来,如果我想确定我的代码的行为是由C定义为我想要的,那么我需要做这样的事情:
buf = (char) ((c > CHAR_MAX) ? (c - (UCHAR_MAX + 1)) : c);
Run Code Online (Sandbox Code Playgroud)
我认为无论是默认字符是有符号还是无符号,无论字符大小如何,都会产生定义的,正确的行为.是对的吗?这样做是否真的需要确保可移植性?
这是OpenSSL 1.0.1i中OPENSSL_cleanse的实现
unsigned char cleanse_ctr = 0;
void OPENSSL_cleanse(void *ptr, size_t len)
{
unsigned char *p = ptr;
size_t loop = len, ctr = cleanse_ctr;
while(loop--)
{
*(p++) = (unsigned char)ctr;
ctr += (17 + ((size_t)p & 0xF));
}
p=memchr(ptr, (unsigned char)ctr, len);
if(p)
ctr += (63 + (size_t)p);
cleanse_ctr = (unsigned char)ctr;
}
Run Code Online (Sandbox Code Playgroud)
它看起来很复杂且线程不安全(通过读写全局变量cleanse_ctr).有人可以解释一下这个实现吗?用户是否需要关注其中可能的数据竞争?
当我在 CodeBlocks 中测试ffmepg 编码/解码 exapmle c 程序时,它显示:
/ffmpeg_sources/ffmpeg/libavutil/internal.h fatal error: config.h: No such file or directory
Run Code Online (Sandbox Code Playgroud)
ffmpeg_source/libavutil文件夹中的许多其他头文件中发生错误。我搜索了该文件夹但没有找到 config.h 文件。其他文件夹中有 config.h,但不适用于 libavutil 文件夹中的头文件。
我尝试下载最新的 ffmepg zip 文件,但也找不到其中的 config.h 文件。
我应该在哪里找到该文件?
使用Autotools时,通常config.h通过如下指定AC_CONFIG_HEADERS宏来生成文件configure.ac:
AC_CONFIG_HEADERS([config.h])
Run Code Online (Sandbox Code Playgroud)
使用CMake时,相应的等价物是什么?
我想知道我如何制作一个可移植的构建系统(一步一步),我目前使用cmake,因为它很容易设置,只有一个拱目标,但现在我必须打包我正在开发的库我想知道如何使它成为我正在测试的可移植的最佳方法.
我知道我需要一个config.h来定义取决于arch的东西,但我不知道它是多么自动化.
任何其他方式有一个构建系统是热烈欢迎!
在Puppet代理的初始配置期间,代理获得由主服务器识别的权限(通常是主服务器本身)签署的安全证书,随后它将向主服务器标识自己.此证书是否过期或需要更新?
我最近一直在尝试提高软件的性能,该软件花费 60% 的时间在 hashmap 中搜索(通过 valgrind profiler 确认)。
当前的实现正在使用boost::unordered_map<long long, FrequencyKey>. 我想与它进行比较google::dense_hash_map<long long, FrequencyKey>。我改变了代码中的一行
boost::unordered_map<long long, FrequencyKey> result;
Run Code Online (Sandbox Code Playgroud)
到
google::dense_hash_map<long long, FrequencyKey> result;
result.set_empty_key(-1);
Run Code Online (Sandbox Code Playgroud)
地图的接口在两个地方被调用。大循环之前result.clear()。循环内result[key]。
我boost::unordered_map<long long, FrequencyKey>的软件性能是118 req/s。通过上面列出的更改,我得到了0.5 req/s。
我显然做错了什么,但在查看文档和 github代码后我自己无法弄清楚。
我正在 CentOS 6.5 上使用 gcc/g++ 4.4.7 编译代码。
我正在努力解决如何在不同精度的定点数上实现算术.我读过R. Yates的论文,但我还是输了.在下文中,我使用Yates的符号,其中A(n,m)指定带有n整数位,m小数位和n + m + 1位的整数的带符号定点格式.
简短的问题:究竟是怎样一个A(a,b)*A(c,d)并A(a,b)+A(c,d)进行时a!=c和b=! d?
长问题:在我的FFT算法中,我生成一个随机信号,其值在-10V和10V之间,有符号输入(in),它被缩放到A(15,16),并且旋转因子(tw)被缩放到A(2,29).两者都存储为ints.像这样的东西:
float temp = (((float)rand() / (float)(RAND_MAX)) * (MAX_SIG - MIN_SIG)) + MIN_SIG;
int in_seq[i][j] = (int)(roundf(temp *(1 << numFracBits)));
Run Code Online (Sandbox Code Playgroud)
同样适用于旋转因素.
现在我需要表演
res = a*tw
问题:
a)我该如何实现?
b)大小应该res是64位吗?
c)我可以制作'res'A(17,14)因为我知道范围a和tw?如果是的话,我应该a*tw按2 ^ 14缩放以存储正确的值 …
c ×6
c++ ×3
cmake ×2
autotools ×1
boost ×1
build-system ×1
clang ×1
codeblocks ×1
ffmpeg ×1
fixed-point ×1
hashmap ×1
io ×1
llvm ×1
macos ×1
openssl ×1
performance ×1
portability ×1
posix ×1
puppet ×1
unix ×1