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);
}
因为alarm 1st参数是无符号整数,所以它可能会将-5转换为无符号值。如果我在第二个警报中发出任何负值的警报,它只返回2147483647?为什么这样。。有什么理论吗?
最佳答案
原因是您指定了40多亿(4294967296-5)秒,对于延迟来说大约是136年。
当带符号的int被提升为unsigned int
时,就会发生这种情况。alarm()
的声明是:
unsigned int alarm (unsigned int seconds);
-5
作为32位值,在twos-complement二进制文件中是1111111111111111111111111111011(这是所有现代cpu使用的)。将该位模式视为无符号整数,使其值为4294967291。
关于linux - SIGALRM以秒为单位给出恒定的负值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33839135/