我不知道如何在每3秒内显示一些东西(比如hello world)。我写的只有C编程与gcc编译器在Linux中。我们可以通过Ctrl+C停止它。我只是想最简单,最简单的方法来操纵我的项目thet代码。非常感谢您的评分!
20jt8wwn1#
while(1) { printf("something\n"); Sleep(3000); //this function counts in milliseconds, so this is what 3 seconds looks like. }
xoefb8l82#
您可能会遇到一个问题,因为标准输出通常是缓冲的,这意味着实现会将输出分批处理,直到方便编写为止。如果你每3秒钟写一次(sleep(3)是一个很好的方法),并且它不是每3秒钟显示一次,试着输入fflush(stdout);或者用`fprintf(stderr,“something\n”)写入标准错误输出;.
sleep(3)
fflush(stdout);
8ehkhllq3#
sleep(3);
sleep函数使程序等待X秒后返回。请注意,这是在执行之间,所以它不会每隔3秒运行一次命令,但对于大多数目的来说足够接近。此外,一些平台有usleep,其中u代表micro,这可以让你获得更高的分辨率。有关详细信息,请参见手册页。
sleep
usleep
vulvrdjw4#
一般的方法是编写一个无限循环(while (1) { ... }),并在每次执行时暂停程序的执行。要暂停,您可以使用标准库中的sleep函数。除了只能以秒为单位指定睡眠时间的sleep之外,您还可以使用nanosleep函数,该函数具有更好的精度。
while (1) { ... }
nanosleep
#include <stdio.h> #include <time.h> int main() { struct timespec t = { 3/*seconds*/, 0/*nanoseconds*/}; while (1){ printf("Wait three seconds and...\n"); nanosleep(&t,NULL); fflush(stdout); //see below } }
请注意,除非你在输出的字符串中添加一个换行符(\n),否则你很可能什么也看不到,因为字符串首先被打印到一个缓冲区,而这个缓冲区偶尔会被刷新到终端(这通常发生在你打印一个换行符时,但即使这样也不能保证每个系统都能刷新)。这就是为什么最好添加fflush调用。
\n
fflush
n3schb8v5#
只是远亲,但我一直使用的一种技术是编写一个程序来显示某个东西 * 一次 *,然后通过使用/usr/bin/watch每 n 秒重复一次。这样我得到了更多的重用。
/usr/bin/watch
2cmtqfgy6#
可以通过**setvbuf()**函数控制流的缓冲区类型。默认情况下,引用文件的流是块缓冲的,而terinals是行缓冲的(stdout)或未缓冲的(stderr)。
#include <stdio.h> int main(int argc, char* argv[]) { setvbuf(stdout, NULL, _IONBF, 0); while ( 1 ) { printf("Wait 3 seconds... "); sleep(3); } }
注意printf中没有**\n**。如果注解掉**setvbuf()**调用,您可以看到在填充缓冲区(通常为1024字节)后,所有输出是如何同时出现的。
6条答案
按热度按时间20jt8wwn1#
xoefb8l82#
您可能会遇到一个问题,因为标准输出通常是缓冲的,这意味着实现会将输出分批处理,直到方便编写为止。如果你每3秒钟写一次(
sleep(3)
是一个很好的方法),并且它不是每3秒钟显示一次,试着输入fflush(stdout);
或者用`fprintf(stderr,“something\n”)写入标准错误输出;.8ehkhllq3#
sleep
函数使程序等待X秒后返回。请注意,这是在执行之间,所以它不会每隔3秒运行一次命令,但对于大多数目的来说足够接近。此外,一些平台有usleep
,其中u代表micro,这可以让你获得更高的分辨率。有关详细信息,请参见手册页。vulvrdjw4#
一般的方法是编写一个无限循环(
while (1) { ... }
),并在每次执行时暂停程序的执行。要暂停,您可以使用标准库中的
sleep
函数。除了只能以秒为单位指定睡眠时间的sleep
之外,您还可以使用nanosleep
函数,该函数具有更好的精度。请注意,除非你在输出的字符串中添加一个换行符(
\n
),否则你很可能什么也看不到,因为字符串首先被打印到一个缓冲区,而这个缓冲区偶尔会被刷新到终端(这通常发生在你打印一个换行符时,但即使这样也不能保证每个系统都能刷新)。这就是为什么最好添加fflush
调用。n3schb8v5#
只是远亲,但我一直使用的一种技术是编写一个程序来显示某个东西 * 一次 *,然后通过使用
/usr/bin/watch
每 n 秒重复一次。这样我得到了更多的重用。2cmtqfgy6#
可以通过**setvbuf()**函数控制流的缓冲区类型。默认情况下,引用文件的流是块缓冲的,而terinals是行缓冲的(stdout)或未缓冲的(stderr)。
注意printf中没有**\n**。如果注解掉**setvbuf()**调用,您可以看到在填充缓冲区(通常为1024字节)后,所有输出是如何同时出现的。