今天我了解到,当stdout设置为终端并在不同情况下进行缓冲时,它是行缓冲的.因此,在正常情况下,如果我使用printf()而不使用终止'\n',则仅当缓冲区已满时才会在屏幕上打印.如何获得这个缓冲区的大小,这有多大?
我正在编写一个脚本,它使用IO.popen打开另一个程序并不断读取数据.就像这样:
process = IO.popen(["/the/program", "argument", "argument"])
loop do
line = process.gets
puts "#{line}"
end
Run Code Online (Sandbox Code Playgroud)
(实际的程序不仅仅是打印输出,显然 - 这只是一个例子.)
我遇到的问题是popen似乎是从打开的进程中缓冲STDOUT.我已经通过直接从shell运行程序并通过popen并排运行来确认这一点,并且Ruby一次不会获得一行.它总是一次获得多行,并且被延迟.
我试过了
STDOUT.sync = true
Run Code Online (Sandbox Code Playgroud)
...在popen之前,但没有改变任何东西.
有问题的程序肯定使用\n作为新行,所以这不是问题.
我想知道使用sleep()函数时puts()和printf()函数之间的区别.
这是我的代码(C语言):
printf("hello, world");
sleep(1);
printf("Good, bye!");
Run Code Online (Sandbox Code Playgroud)
编译并运行程序后,它似乎先睡了然后打印"你好,世界好,再见!"
但是,如果使用puts()而不是printf(),它将打印"hello,world"然后睡眠,最后打印"Good,bye".
puts("hello, world");
sleep(1);
puts("Good, bye!);
Run Code Online (Sandbox Code Playgroud) sys.stderr多久刷新一次缓冲区,这是不同环境中的标准?
>>> import sys
>>> sys.__stderr__
<open file '<stderr>', mode 'w' at 0x2b4fcb7ac270>
Run Code Online (Sandbox Code Playgroud)
我看到它只是一个标准的文件类型,但我不知道它应该是什么缓冲值.dir()似乎也没有产生任何有用的信息.
我正在从文件中读取大约300万行并将它们插入到STL映射中.所以,在我的while循环中,我从文件中读取每一行,我还打印到通过一个简单的cout语句控制它是什么行号.我的一位朋友最近指出,这会使代码变慢.我想知道这是否属实,是不是为什么?
slave fd被另一个应用程序(比如"A")用作串行端口设备.
A将设置其波特率/停止位等.我的应用程序需要此信息.
顺便说一下,有没有办法让只有主fd打开的进程被通知所有ioctl()发给奴隶fd的电话?
我想确定 printf 的时间复杂度,例如:
{
printf("%d",
i);
}
Run Code Online (Sandbox Code Playgroud)
或者:
{
printf("%c",
array[i]);
}
Run Code Online (Sandbox Code Playgroud)
假设 printf 的时间复杂度始终为 O(1) 是否正确?
[编辑] 让我们采用一个交换两个值的函数:
void swap(...)
{
tmp = x;
x = y;
y = tmp;
}
Run Code Online (Sandbox Code Playgroud)
每个赋值表达式的成本为 1(就时间复杂度而言),因此 T(n) = 1 + 1 + 1 = 3,这意味着 O(1)。但对于这个功能我能说什么呢?
void swap(...)
{
tmp = x;
x = y;
y = tmp;
printf("Value of x: %d", x);
printf("Value of y: %d", y);
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下我可以说 T(n) 仍然是 O(1) 吗?
所以我在bash上运行这个:
# somedevice -getevent
Run Code Online (Sandbox Code Playgroud)
这个命令的作用就是它一直在运行,每当我的设备发送某个数据时,说它检测到温度的变化,它输出这样的东西
/dev/xyz: 123 4567 8910112238 20
/dev/xyz: 123 4567 8915712347 19
/dev/xyz: 123 4567 8916412345 22
/dev/xyz: 123 4567 8910312342 25
/dev/xyz: 123 4567 8910112361 18
/dev/xyz: 123 4567 8910112343 20
Run Code Online (Sandbox Code Playgroud)
这只是一直运行,一旦有任何原因它输出一些东西.所以执行无止境.
没有回声正常工作,但是当我尝试使用'>'运算符时,这似乎不会写入文件.
所以举个例子
#somedevice -getevent > my_record_file
Run Code Online (Sandbox Code Playgroud)
这不能正常工作,my_record_file只能间隔地写入数据,但是我想立即写入.
有任何想法吗?
我有一个 C 源代码,如下所示。
#include<stdio.h>
#include<stdlib.h>
#include<sys/wait.h>
#include<unistd.h>
#include<sys/types.h>
int main(void) {
pid_t process_id;
int status;
if (fork() == 0)
{
if (fork() == 0)
{
printf("A");
} else {
process_id = wait(&status);
printf("B");
}
} else {
if (fork() == 0)
{
printf("C");
exit(0);
}
printf("D");
}
printf("0");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我在终端中执行它时,我在这张图片中出现了一些输出:
我实际上很困惑这些输出是如何生成的。例如, D0A0~$ B0C 是如何生成的。
谁能解释一下这些输出是如何生成的,以及这段代码中 exit(0) 的功能?
所以我写了一个测试程序,这里是代码
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i;
printf("%s", "entering\n");
fflush(stdout);
for (i = 0 ; i < 3 ; i++)
{
fork();
fflush(stdout);
}
printf("%s", "exiting\n");
}
Run Code Online (Sandbox Code Playgroud)
当我在终端中编译并运行它时,它会显示我所期望的:"进入"一次,"退出"一些.当我运行它并将输出重定向到文件时,它会显示每个退出的输入.
1)为什么每次都不向终端和文件输出相同的东西?
2)为什么它显示8次输入文件但没有在终端输入一次(一次是我期望它做的).
3)当我的输出转到文件时,fflush()语句会有所不同吗?