除了在现代POSIX环境中使用外,我还可以使用什么?
我是C的新手,但写了一个小的multithreading应用程序。 我想对线程引入延迟。 我一直在使用’usleep’并且行为是我想要的 – 但它会在C99中产生警告。
函数’usleep’的隐式声明
这只是一个警告,但它困扰我。 我用谷歌搜索了一个答案,但我能找到的只是一个while循环/定时器方法,看起来像是CPU密集型。
编辑:
我的包括:
#include #include #include #include #include
我正在调用编译器:
c99 program.c -Wall -pedantic -W -lpthread
编辑#2:
我创建了一个包含以下内容的新文件:
#include int main(void) { usleep(10); }
我仍然得到警告。
编辑#3:正如所建议的,我已经更新了问题的文本。
问题是您使用的是标准C99编译器,但您正在尝试访问POSIX扩展。 要公开POSIX扩展,您应该例如将_POSIX_C_SOURCE定义为200809L(对于当前标准)。 例如这个程序:
#include 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扩展可用。
另外-Wall,-pedantic和-W的选项没有为POSIX c99命令定义,那些看起来更像是gcc命令给我(如果它们在你的系统上运行那么那很好,只要知道它们不能移植到其他POSIX)系统)。
您可能在现代POSIX系统上:
POSIX.1-2008删除了usleep()的规范。
在我的系统(linux)上有一个宏的详细解释,必须设置它才能恢复该function。 但是你应该遵循zvrba已经给出的建议,而是使用nanosleep
。
从手册页:此function已过时。 请改用nanosleep。
函数’usleep’的隐式声明
此警告通常意味着您没有#include
正确的头文件,在本例中为unistd.h
。
你有#include
吗?
你可以使用一些类似的方法:nanosleep()表示纳秒,sleep()表示秒数。 或者另一种方式可能是使用clock(),但我认为这更浪费CPU。