achul@achul:~/chennai/linux/SM_practise$ cat doubt.c
#include<stdio.h>
#include<signal.h>
main()
{
int ret;
printf("\nhello x : if i'm give -ve alarm second then what it will return \n");
ret=alarm(-5);
printf("ret=%d\n",ret);//
ret=alarm(8);
printf("ret=%d\n",ret);// why exactly 2G
while(1);
}
因为警报第一个参数是无符号整数,所以可能是将 -5 转换为无符号值。如果我在第二个警报中给出任何负值警报,它只返回 2147483647 吗?为什么会这样……有什么理论吗?
最佳答案
原因是您为延迟指定了 4+ 十亿 (4,294,967,296 - 5) 秒——大约 136 年。
这就是将 signed int 提升为 unsigned int
时发生的情况。 alarm()
的声明是:
unsigned int alarm (unsigned int seconds);
-5
作为 32 位值在 twos-complement 中为 1111 1111 1111 1111 1111 1111 1111 1011 (这是所有现代 CPU 使用的)二进制。
将该位模式视为一个 unsigned int 使其值为 4,294,967,291。
关于linux - SIGALRM 以负数给出秒的常数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33839135/