首页 > 解决方案 > 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 行(如上面的代码),程序工作正常(即它打印一堆随机数太快,甚至看不到它们是否真的是随机的),但是如果我删除注释,程序不会打印任何东西并退出(甚至不是第一次,在它进入睡眠之前),即使它编译时没有警告或错误,有或没有注释。

标签: cforkposixsleep

解决方案


但是如果我删除评论,程序不会打印任何内容并退出

它不会打印,但也不会真正退出。它仍将在后台运行一个进程。这个过程会运行你的无限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

我怀疑如果您只是让程序运行,它最终会打印出来。有意义的是,它有一个有限的缓冲区,并且当它满时会刷新。但这只是一个(受过教育的)猜测,这取决于您的终端。

它以太快的速度打印一堆随机数,甚至无法查看它们是否真的是随机的

你怎么看一个数字序列是否是随机的?(扮演魔鬼代言人)


推荐阅读