小编Yan*_*aud的帖子

未定义的引用`pow'和`floor'

我正在尝试在C中制作一个简单的斐波那契计算器,但在编译时gcc告诉我,我错过了战俘和地板功能.怎么了?

码:

#include <stdio.h>
#include <math.h>

int fibo(int n);

int main() {
        printf("Fib(4) = %d", fibo(4));
        return 0;
}

int fibo(int n) {
        double phi = 1.61803399;

        return (int)(floor((float)(pow(phi, n) / sqrt(5)) + .5f));
}
Run Code Online (Sandbox Code Playgroud)

输出:

gab@testvm:~/work/c/fibo$ gcc fib.c -o fibo
/tmp/ccNSjm4q.o: In function `fibo':
fib.c:(.text+0x4a): undefined reference to `pow'
fib.c:(.text+0x68): undefined reference to `floor'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

c gcc undefined-reference

117
推荐指数
5
解决办法
18万
查看次数

为什么这个宏被定义为({1;})?

在Linux的多个ARM后端,我在文件中看到clkdev.h这个宏定义:

#define __clk_get(clk) ({ 1; })
Run Code Online (Sandbox Code Playgroud)

参见例如 ./arch/arm/mach-versatile/include/mach/clkdev.h

此宏在表达式中使用GCC扩展语句和声明

后来这个宏在文件./drivers/clk/clkdev.c中用于函数clk_get_sys()

 if (cl && !__clk_get(cl->clk))
         cl = NULL;
Run Code Online (Sandbox Code Playgroud)

我想知道为什么不在这里使用一个简单的宏:

#define __clk_get(clk) (1)
Run Code Online (Sandbox Code Playgroud)

编辑:

我使用以下grep模式在整个内核源代码中找到了此构造的一些其他用法:

grep -R '({[[:space:]]*[a-zA-Z0-9_()+=/!&*>., ?:-]\+[[:space:]]*;[[:space:]]*})' .
Run Code Online (Sandbox Code Playgroud)

这是一些比赛:

./kernel/trace/trace_selftest.c:# define trace_selftest_startup_dynamic_tracing(trace, tr, func) ({ 0; })
./kernel/profile.c:#define create_hash_tables()         ({ 0; })
./include/asm-generic/bug.h: * Use of ({0;}) because WARN_ON_SMP(x) may be used either as
./include/asm-generic/bug.h:# define WARN_ON_SMP(x)         ({0;})
./include/linux/key.h:#define key_get(k)            ({ NULL; })
./include/linux/key.h:#define key_get(k)            ({ NULL; })
./include/linux/audit.h:#define audit_alloc(t) ({ 0; …
Run Code Online (Sandbox Code Playgroud)

c linux macros gcc linux-kernel

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

子进程接收父进程的SIGINT

我有一个使用Qt Framework的简单程序.它使用QProcess来执行RAR并压缩一些文件.在我的程序中,我正在捕获SIGINT并在代码中执行某些操作:

signal(SIGINT, &unix_handler);
Run Code Online (Sandbox Code Playgroud)

当SIGINT发生时,我检查RAR进程是否完成,如果不是,我将等待它...问题是(我认为)RAR进程也得到了SIGINT,这是我的程序,它退出之前它压缩了所有文件.

有没有办法运行RAR进程,以便在我的程序收到它时它不会收到SIGINT?

谢谢

c c++ unix linux

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

REP做什么设置?

引用英特尔 ®64 和IA-32架构优化参考手册,§2.4.6"REP String Enhancement":

使用REP字符串的性能特征可归因于两个组件: 启动开销和数据传输吞吐量.

[...]

对于较大粒度数据传输的REP字符串,随着ECX值的增加,REP String的启动开销呈逐步增加:

  • 短串(ECX <= 12):REP MOVSW/MOVSD/MOVSQ的延迟约为20个周期,
  • 快速字符串(ECX> = 76:不包括REP MOVSB):处理器实现通过移动尽可能多的16字节数据来提供硬件优化.如果其中一个16字节数据传输跨越缓存行边界,则REP字符串延迟的延迟会有所不同:

    • 无拆分:延迟包括大约40个周期启动成本,每个64字节的数据增加4个周期,
    • 高速缓存拆分:延迟包括大约35个周期启动成本,每64个字节的数据增加6个周期.
  • 中间字符串长度:REP MOVSW/MOVSD/MOVSQ的延迟具有大约15个周期启动成本加上word/dword/qword中数据移动的每次迭代的一个周期.

(强调我的)

没有进一步提及这种启动成本.它是什么?它做了什么,为什么总是需要更多的时间?

optimization performance x86 assembly

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

iOS ARM设备(iPhone 4)支持低于标准的IEEE 754浮点数

在将应用程序从Linux x86移植到iOS ARM(iPhone 4)时,我发现浮点算术和小值的行为存在差异.

IEEE 754-1985/IEEE 754-2008标准中,小于[+/-] 2.2250738585072014E-308的64位浮点数(双)被称为非正规/非正规化/次正规数.

在iPhone 4上,这样的小数字被视为零(0),而在x86上,可以使用次正规数字进行计算.

我无法在Apple的文档Mac OS X手册页上找到有关符合IEEE-754标准的任何解释.对于float(3).

但由于对堆栈溢出(一些答案刷新到零的行为在浮点运算,双VS浮在iPhone上),我已经找到了一些线索.

根据一些搜索,似乎沿着ARM内核使用的VFP(或NEON)数学协处理器正在使用Flush-To-Zero(FTZ)模式(例如,在输出处将次正常值转换为0)和Denormals-Are-Zero( DAZ)模式(例如,当用作输入参数时,将正常值转换为0)以提供快速硬件处理的IEEE 754计算.

  • 完全符合IEEE754标准的ARM支持代码
  • 运行快速模式,符合IEEE754标准(仅限硬件)

关于FTZ和DAZ的一个很好的解释可以在IA-32中的 x87和SSE浮点辅助中找到:清零(FTZ)和非正规零(DAZ):

FTZ和DAZ模式都处理发生无效浮点数据或使用下溢或非正常条件处理的情况.[...].FTZ和DAZ处理的数字之间的差异非常微妙.FTZ处理下溢情况,而DAZ处理非正规数.当计算导致非正规时,发生下溢情况.在这种情况下,FTZ模式将输出设置为零.DAZ修复了非正规用作输入时的情况,可以是常量,也可以是将无效内存读入寄存器.DAZ模式在计算之前将计算的输入设置为零.然后可以说FTZ处理[输出]而DAZ处理[输入].

关于Apple开发者网站上FTZ的唯一内容似乎是在iOS ABI函数调用指南中:

VFP状态寄存器| FPSCR | 特别| 函数调用不保留条件代码位(28-31)和饱和位(0-4).异常控制(8-12),舍入模式(22-23)和清零到零(24)位应仅由影响应用程序状态的特定例程(包括框架API函数)修改.在函数进入和退出时,短向量长度(16-18)和步长(20-21)位必须为零.不得修改所有其他位.

根据ARM1176JZF-S技术参考手册,18.5操作模式(第一个iPhone处理器),VFP可以配置为完全支持IEEE 754(子正常算术),但在这种情况下它需要一些软件支持(陷入内核到用软件计算).

注意:我还阅读了Debian的ARM Hard Float PortVFP比较页面.

我的问题是:

  • 哪里可以找到关于跨iOS设备的次正规数处理的明确答案?

  • 是否可以设置iOS系统以支持次正规数而无需编译器仅生成完整的软件浮点代码?

谢谢.

c floating-point arm ieee-754 ios

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

一个进程锁定了多少内存

使用getrlimit(RLIMIT_MEMLOCK),可以获得进程可以分配的允许的锁定内存量(mlock()或mlockall()).

但是如何检索当前锁定的内存量?

例如,getrusage()没有返回任何信息.

在Linux下,可以读取/ proc/self/status并从VmLck开始的行中提取锁定内存量.

是否有一种可移植的方法来检索可在Linux,*BSD和其他POSIX兼容系统上运行的锁定内存量?

c unix linux bsd posix

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

fwrite()替代32位系统上的大文件

我正在尝试用C代码生成大文件(4-8 GB).现在我用fopen()'wb'参数来打开文件的二进制和fwrite()在功能上for环要写入的字节到文件.我在每次循环迭代中写一个字节.在文件大于或等于4294967296字节(4096 MB)之前没有问题.它看起来像32位操作系统中的一些内存限制,因为当它写入打开的文件时,它仍然在RAM中.我对吗?症状是创建的文件比我想要的更小.差异是4096 MB,例如,当我想要6000 MB文件时,它创建6000 MB - 4096 MB = 1904 MB文件.

你能建议其他方法来完成这项任务吗?

问候 :)

部分代码:

unsigned long long int number_of_data = (unsigned int)atoi(argv[1])*1024*1024; //MB
char x[1]={atoi(argv[2])};

fp=fopen(strcat(argv[3],".bin"),"wb");

    for(i=0;i<number_of_data;i++) {
        fwrite(x, sizeof(x[0]), sizeof(x[0]), fp);
    }

fclose(fp);
Run Code Online (Sandbox Code Playgroud)

c windows file-io

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

如何确保正确的文件权限

为了保护应用程序不被错误地使用,我正在尝试检查其配置文件是否具有正确的权限,以便应用程序可以信任未被其他人修改的文件的内容.

我相信以下规则是正确的:

  • 该文件不得被其他人写入
  • 该文件必须由受信任的用户/组拥有:root或
  • 该文件必须由运行该应用程序的有效用户/组拥有(想想setuid程序)

这是一个例子:

#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>

#include <string.h>
#include <errno.h>

static
int is_secure(const char *name)
{
    struct stat st;

    uid_t euid = geteuid();
    gid_t egid = getegid();

    if (stat(name, &st) != 0) {
        int err = errno;
        fprintf(stderr, "can't stat() '%s': %d (%s)\n", name, err, strerror(err));
        return 0;
    }

    /* writable by other: unsecure */
    if ((st.st_mode & S_IWOTH) != 0) {
        return 0;
    }

    /* not owned by group root and not owned …
Run Code Online (Sandbox Code Playgroud)

c unix security permissions file

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

使用Android NDK使用-fsigned-char构建是否安全?

为了与其他平台保持一致,我需要使用signed char我正在处理的一些本机代码.但默认情况下Android NDK char类型是unsigned.

我曾尝试显式使用signed char类型但是differ in signedness当涉及到字符串常量/库函数时它会生成太多警告,所以我希望用它来构建我的代码-fsigned-char.

我现在正在尝试使用Android ARM ABI和API时遇到问题-fsigned-char,但我还没有发现任何问题.

ARM体系结构ABI(AAPCS)的过程调用标准中,7.1.1算术类型和ARM体系结构的C库ABI,5.6 inttypes.h,char据说是unsigned.

您是否知道-fsigned-char在Android NDK中启用C库(Android上可用的其他库)时是否会出现问题?

c embedded android arm android-ndk

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

Linux设备驱动程序访问控制

我正在为一些新颖的硬件实现设备驱动程序,并希望一次只允许一个进程访问该设备.并发读/写操作会使硬件混淆到可能需要发生硬复位的程度.我还有以下问题:

  1. 在示例代码Linux设备驱动程序,该open()呼叫使用了锁,但close()没有.这里是不是还有竞争条件,还是scull_s_count保证是原子的减量?基本上,在这个例子中,我想知道如果一个进程试图在另一个进程正在收尾并关闭它时正确地打开设备会发生什么.

  2. 我假设我不需要scull_s_count在我read()write()调用中检查我的开放标志的状态(我正在做类似于示例的事情),因为进入这些调用的唯一方法是用户空间应用程序是否已经收到在fd通过成功调用open().这个假设是否正确?

感谢tadman的评论,我对内核的atomic_t机制进行了粗略的搜索.这是我现在拥有的一些伪代码:

int open(struct inode *inode, struct file *filp) {
  spin_lock(&lock);
  if (atomic_read(&open_flag)) {
    spin_unlock(&lock);
    return -EBUSY;
  }
  atomic_set(&open_flag, 1);
  /* do other open() related stuff */
  spin_unlock(&lock);
  return 0;
}

int close(struct inode *inode, struct file *filp) {
  int rc;
  /* do close() stuff */
  atomic_set(&open_flag, 0);
  return rc;
}
Run Code Online (Sandbox Code Playgroud)

open_flag是一个atomic_t分配的更大结构的一部分kzalloc() …

c linux linux-device-driver linux-kernel

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