我的程序陷入了简单的调用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/