打印一半内容后printf可以暂停

时间:2013-06-03 10:33:36

标签: c linux

printf可以暂停打印输出吗?如果是,可以有人为我提供相关背景。例如

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

首先打印"H" 然后睡觉10秒,然后打印"ello World"

4 个答案:

答案 0 :(得分:4)

是的,有可能。 由于您使用printf(而不是fprintf),输出将被放置在标准输出上,现在如果您将输出重定向到阻止写入的文件/设备,则此简单调用{{1可以睡觉,例如10秒。

情景:

  • 创建echo.c:

    printf
  • 创建一个名为fifo:

    #include <stdio.h>
    main() {
         printf("Hello World\n");
    }
    
  • 编译echo.c:

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

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

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

答案 1 :(得分:2)

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

例如,EINTR将发生在被I / O严重打击的系统上。因为write()不能保证完成,所以可以中断它。

所以,我没有得到你所看到的。你看到了什么问题?

答案 2 :(得分:0)

您可以编写自己的printf版本(比如printf_delay),它会打印您的字符串,并遍历每个字符,打印然后再睡眠一段指定的时间。

e.g:

void printf_delay(char* str, unsigned int delay){
    int c=0;
    while (str[c] != '\0'){
        /* Print character */
        /* Sleep for */
        /* Increment c */
    }
}

答案 3 :(得分:0)

我看到了两个解决方案:

  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;
    }
    
  3. PS:我从某个网页上获取了putc()来源,请在使用之前重新检查(也许找到其他任何putc()实现)。