1

可以printf在打印输出的过程中暂停吗?如果是的话,有人可以给我一个相关的背景。例如

是否有可能以下printf()打印 printf("Hello World\n")

首先打印"H" ,然后休眠 10 秒,然后打印"ello World"

4

4 回答 4

4

对的,这是可能的。由于您使用printf(而不是fprintf)输出将被放置在标准输出上,现在如果您将输出重定向到阻止写入的文件/设备,那么这个简单的调用printf可以休眠例如 10 秒。

设想:

  • 创建 echo.c:

    #include <stdio.h>
    main() {
         printf("Hello World\n");
    }
    
  • 创建一个命名的FIFO:

    mkfifo fifo
    
  • 编译 echo.c:

    make echo
    
  • 运行 echo 并将其输出重定向到fifo

    ./echo > fifo
    
  • 这会阻塞,直到某个其他进程读取该fifo文件,因此在不同的 shell 运行 10 秒后:

    cat fifo
    
  • 只有这样echo程序才能继续并将“Hello World\n”写入fifo文件

于 2013-06-03T10:48:16.690 回答
2

printf 最终调用 write()。例如,如果 write() 系统调用因为系统调用接收到 EINTR 而返回 -1,则可能已经写入了某些数据。但是,tty(屏幕)是行缓冲的。\n这意味着在将字符放置在输出流 上之前,屏幕上不会出现任何内容。

例如,EINTR 会发生在真正受到 I/O 影响的系统上。因为 write() 不能保证完成,所以可以中断。

所以,我不明白你所看到的。你看到什么问题?

于 2013-06-03T10:40:04.257 回答
0

您可以编写自己的printf(say printf_delay) 版本,它将您的字符串打印出来,并遍历每个字符,打印然后休眠指定的时间长度。

例如:

void printf_delay(char* str, unsigned int delay){
    int c=0;
    while (str[c] != '\0'){
        /* Print character */
        /* Sleep for */
        /* Increment c */
    }
}
于 2013-06-03T15:09:00.180 回答
0

我看到了 2 个解决方案:

  1. 简单地分成printf()两个printf()

    printf("H");
    sleep(10);
    printf("ello World\r\n");
    
  2. 另一种方法是重写putc()函数。它用于printf()输出字符,因此如果您添加一些延迟,putc()您将在打印符号之间获得 10 秒。注意:此延迟将适用于您的任何角色,而不仅仅是一次。

    int putc(int c, FILE *fp){
        char ch;
        ch = c;
        write(fp->fd, &ch, 1);
        sleep(10);
        return(c);
    }
    
    int main(){
        char test[] = "Hello World\r\n";
        printf("%s", test);
        return 0;
    }
    

PS:我putc()从一些互联网页面获取源代码,请在使用前重新检查(可能会找到任何其他putc()实现)。

于 2013-06-04T06:28:50.087 回答