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/

10-16 01:09