我的程序陷入了简单的调用usleep(1.);中。这个怎么可能?我应该注意什么?

编辑:

为了使事情更加困惑,只有在我之前调用rand()时,它才会卡住:

rand();
usleep(1.);

两次通话都很好。

编辑2:

这是一个可行的最小示例:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char* argv[]) {
        printf("Calling rand() and then usleep(1) on pid %d \n",getpid());
        rand();
        usleep(1);
        printf("Finished.\n");
        return 0;
}

此功能也适用:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char* argv[]) {
        printf("Calling usleep(1.) on pid %d \n",getpid());
        usleep(1.);
        printf("Finished.\n");
        return 0;
}

但是,这一点不能:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char* argv[]) {
        printf("Calling rand() and then usleep(1.) on pid %d \n",getpid());
        rand();
        usleep(1.);
        printf("Finished.\n");
        return 0;
}

我使用命令gcc -std=c99 main.c在gcc版本4.4.6中编译了这些代码。选项-std=c99是问题吗?但是我仍然不明白这里发生了什么。

最佳答案

您正在使用usleep()值调用double,而将其指定为采用有限范围的useconds_t类型的无符号整数。参见the manual page

在您的平台上,转换可能会失败。尝试删除句点,然后使用1调用它。

不要引入强制类型转换,最好不要提及useconds_t类型。

另外,请注意此功能已过时,新的POSIX代码应改用nanosleep()

UPDATE 顺便说一句,上面链接的手册页似乎还暗示您应该对#define正确列出#include <unistd.h>之前列出的符号,才能获得此功能。您应该尝试这样做,如果您没有获得原型(prototype),则不会自动从double转换参数。 rand()的(忽略)返回值也可能在某些寄存器中或在堆栈中,从而导致情况进一步改变。

关于c - 卡在usleep中(1.),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14340485/

10-11 18:53