我正在阅读另一个生成输出的进程的输出(缓慢且无限)。因为我想实时读取这些数据,所以我使用“stdbuf -oL”(行缓冲,数据是文本)。我不能控制生成进程,因此我无法修改源代码来强制刷新。
到目前为止,stdbuf工作得很好,但是该进程使用SOCK_RAW,并且需要以root身份运行,设置setuid(0)或具有cap_net_raw功能。当以非root身份运行并具有setuid或功能时,stdbuf似乎会被忽略。让我演示一下问题:
这是一个简单的写入器:
到目前为止,stdbuf工作得很好,但是该进程使用SOCK_RAW,并且需要以root身份运行,设置setuid(0)或具有cap_net_raw功能。当以非root身份运行并具有setuid或功能时,stdbuf似乎会被忽略。让我演示一下问题:
这是一个简单的写入器:
#include <stdio.h>
#include <unistd.h>
int main(){
int i;
for ( i = 0;; i++){
fprintf(stdout, "%d\n", i);
sleep(1);
}
}
还有一个简单的阅读器:
#include <stdio.h>
int main(){
char* line = NULL;
size_t n = 0;
while (getline(&line, &n, stdin) != -1 ) {
fputs(line, stdout);
}
}
如预期所料,执行 ./writer | ./reader
时,直到缓冲区被填满才会显示出内容。在命令前加入 stdbuf -oL
可以启用行缓冲,使得读取者能够逐行获取内容:
% stdbuf -oL ./writer | ./reader
0
1
2
...
但是,如果我添加 cap_net_raw+ep
,它就无法工作:
% sudo setcap cap_net_raw+ep ./writer
% stdbuf -oL ./writer | ./reader
(no output)
使用 setuid 时,观察到相同的行为:
% sudo chown root:root ./writer
% sudo chmod +s ./writer
% stdbuf -oL ./writer | ./reader
(no output)
我希望了解为什么会发生这种情况以及如何在不以root身份运行的情况下继续使用stdbuf。我承认我不完全理解setuid在幕后所做的工作。