除了在现代POSIX环境中使用外,我还可以使用什么?

时间:2011-09-25 14:48:47

标签: c posix c99

我对C很新,但写了一个小的多线程应用程序。我想对线程引入延迟。我一直在使用'usleep'而且行为是我想要的 - 但它会在C99中产生警告。

  

隐式声明函数'usleep'

这只是一个警告,但它困扰我。我用谷歌搜索了一个答案,但我能找到的只是一个while循环/定时器方法,看起来像是CPU密集型。

编辑:

我的包括:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <time.h>

我正在调用编译器:

c99 program.c -Wall -pedantic -W -lpthread

编辑#2:

我创建了一个包含以下内容的新文件:

#include <unistd.h>

int main(void) {
    usleep(10);
}

我仍然收到警告。

编辑#3:编辑#3: 正如所建议的那样,我已经更新了问题的内容。

5 个答案:

答案 0 :(得分:5)

问题是您使用的是标准C99编译器,但是您正在尝试访问POSIX扩展。要公开POSIX扩展,您应该例如将_POSIX_C_SOURCE定义为200809L(对于当前标准)。例如这个程序:

#include <time.h>

int main(void) {
        struct timespec reqtime;
        reqtime.tv_sec = 1;
        reqtime.tv_nsec = 500000000;
        nanosleep(&reqtime, NULL);
}
使用以下编译命令

将正确编译并等待1.5秒(1秒+ 500000000纳秒):

c99 main.c -D _POSIX_C_SOURCE=200809L

必须使用适当的值定义_POSIX_C_SOURCE宏,以使POSIX扩展可用。

还没有为POSIX c99命令定义选项-Wall,-pedantic和-W,那些看起来更像是gcc命令给我(如果它们在你的系统上运行那么那很好,只要知道它们不是便携式的到其他POSIX系统)。

答案 1 :(得分:4)

您可能正在使用现代POSIX系统:

  

POSIX.1-2008删除了usleep()的规范。

在我的系统(linux)上,有一个宏的详细解释,必须设置它才能恢复该功能。但是你应该遵循zvrba已经给出的建议,改为使用nanosleep

答案 2 :(得分:1)

从手册页:此功能已过时。请改用nanosleep。

答案 3 :(得分:0)

  

隐式声明函数'usleep'

此警告通常表示您没有#include正确的头文件,在本例中为unistd.h

答案 4 :(得分:0)

你有#include <unistd.h>吗?

你可以使用一些类似的方法:nanosleep()表示纳秒,sleep()表示秒数。或者另一种方式可能是使用clock(),但我认为这更浪费CPU。