c - C(POSIX)中的睡眠功能破坏了我的程序
问题描述
这是我的程序代码:
#include <unistd.h>
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <sys/types.h>
void function() {
srand(time(NULL));
while(1) {
int n = rand();
printf("%d ", n);
//sleep(1);
}
}
int main() {
pid_t pid;
pid = fork();
if (pid == 0) {
function();
}
}
注释掉 sleep 行(如上面的代码),程序工作正常(即它打印一堆随机数太快,甚至看不到它们是否真的是随机的),但是如果我删除注释,程序不会打印任何东西并退出(甚至不是第一次,在它进入睡眠之前),即使它编译时没有警告或错误,有或没有注释。
解决方案
但是如果我删除评论,程序不会打印任何内容并退出
它不会打印,但也不会真正退出。它仍将在后台运行一个进程。这个过程会运行你的无限while循环。
在中使用您的代码p.c
:
$ gcc p.c
$ ./a.out
$ ps -A | grep a.out
267282 pts/0 00:00:00 a.out
$ killall a.out
$ killall a.out
a.out: no process found
问题是它printf
并没有真正打印出来。它只将数据发送到输出缓冲区。为了强制打印输出缓冲区,调用fflush(stdout)
如果您不刷新,那么您只需依赖您正在使用的终端的行为。当您将换行符写入输出流时,终端刷新是很常见的。这就是为什么最好使用它printf("data\n")
而不是printf("\ndata")
. 有关更多信息,请参阅此问题:https ://softwareengineering.stackexchange.com/q/381711/283695
我怀疑如果您只是让程序运行,它最终会打印出来。有意义的是,它有一个有限的缓冲区,并且当它满时会刷新。但这只是一个(受过教育的)猜测,这取决于您的终端。
它以太快的速度打印一堆随机数,甚至无法查看它们是否真的是随机的
你怎么看一个数字序列是否是随机的?(扮演魔鬼代言人)
推荐阅读
- javascript - 如何使用通过 npm install 添加的组件
- scala - Scala SAM:使用 lambda 实现时如何访问 SAM 特征的受保护成员?
- laravel - Laravel 5.7.1 和 Forms & HTML 包之间的冲突?
- sql - 根据带有文本的分类列创建布尔列
- javascript - 如果存在不同的类,我如何有条件地将 CSS 应用于一个类?
- cocoa - 如何使用 Cocoa 获取具有给定 ID 的捆绑包的 URL,反之亦然?
- opengl - Is it ok to declare an oversized output array in fragment shader and leave some indices unused?
- vba - 完成后停止运行当前代码的 VBA 代码
- python - pyspark create dictionary from data in two columns
- android - Android Architecture sample unit testing live data