5

我的程序卡在了简单的调用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 版本 4.4.6 编译这些命令gcc -std=c99 main.c。选项-std=c99有问题吗?但我仍然不明白这里发生了什么。

4

3 回答 3

5

usleep()用一个double值调用,而它被指定为一个useconds_t范围有限的无符号整数。请参阅手册页

在您的平台上,转换可能失败。尝试删除句号,然后用1.

不要引入演员表,最好不要提及useconds_t类型。

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

更新顺便说一句,上面链接的手册页似乎也暗示您应该#define使用之前列出的正确符号#include <unistd.h>来获得此功能。你应该尝试一下,如果你没有得到原型,参数将不会自动从double. (忽略的)返回值rand()也可能在某个寄存器或堆栈中,在这种情况下会导致事情进一步改变。

于 2013-01-15T15:09:09.743 回答
2

从 usleep http://www.manpagez.com/man/3/usleep/的手册页中,输入参数usleepisuseconds_t和 notfloat如您的代码中所示

于 2013-01-15T15:08:44.053 回答
0

我尝试了几件事。

  1. 也没有什么特别的rand(); printf。下面也显示了这种行为(它在说“开始”后挂起),但如果第一个printf()被注释掉,程序就完成了。

    include <stdio.h>
    include <unistd.h>
    
    void main(int argc, char* argv[]) {
        printf ("Starting\n"); 
        usleep(10.1);
        printf("Finished.\n");
    }
    
  2. 如果您使用-std=gnu89(或 gnu99)而不是-std=c89(或 c99)进行编译,您的程序将始终有效。

  3. -o0 到 -o3 的各种排列没有区别。

  4. usleep需要一个整数,而不是浮点数。如果你明确地转换它,即usleep((int)10.1),程序不会挂起。

  5. 打开警告(-Wall -Wextra -Wconversion)抱怨隐式声明usleep.

于 2013-01-15T16:18:15.887 回答