可以printf
在打印输出的过程中暂停吗?如果是的话,有人可以给我一个相关的背景。例如
是否有可能以下printf()
打印
printf("Hello World\n")
首先打印"H"
,然后休眠 10 秒,然后打印"ello World"
对的,这是可能的。由于您使用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
文件
printf 最终调用 write()。例如,如果 write() 系统调用因为系统调用接收到 EINTR 而返回 -1,则可能已经写入了某些数据。但是,tty(屏幕)是行缓冲的。\n
这意味着在将字符放置在输出流 上之前,屏幕上不会出现任何内容。
例如,EINTR 会发生在真正受到 I/O 影响的系统上。因为 write() 不能保证完成,所以可以中断。
所以,我不明白你所看到的。你看到什么问题?
您可以编写自己的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 */
}
}
我看到了 2 个解决方案:
简单地分成printf()
两个printf()
printf("H");
sleep(10);
printf("ello World\r\n");
另一种方法是重写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()
实现)。