Shell 如何冲洗当前运行的所有管道?
我有一些管道进程正在后台运行,已经运行了一天多了Shell 如何冲洗当前运行的所有管道?,shell,pipe,Shell,Pipe,我有一些管道进程正在后台运行,已经运行了一天多了 $ cmd | cmd | cmd | cmd | cmd > file 是否可以刷新所有管道,以便查看文件中的当前状态?解决方案 编撰 #include <stdio.h> #include <unistd.h> #include <sys/errno.h> int main(int argc, char **argv){ fflush(NULL); if (!errno) sync();
$ cmd | cmd | cmd | cmd | cmd > file
是否可以刷新所有管道,以便查看文件中的当前状态?解决方案
编撰
#include <stdio.h>
#include <unistd.h>
#include <sys/errno.h>
int main(int argc, char **argv){
fflush(NULL);
if (!errno) sync();
return errno;
}
#包括
#包括
#包括
int main(int argc,字符**argv){
fflush(空);
如果(!errno)sync();
返回errno;
}
比如说,fflush
,但根据您的个人偏好和权限,它位于~/bin
或/opt/bin
或/usr/local/bin
,请确保此命令位于您的路径中,并简单地使用它
讨论
这个(简单!)的东西在通常的工具集中并不存在,这表明它很少有用:一般来说,这会挫败操作系统的智能化尝试,并使事情变得缓慢。更糟糕的是,对于像您展示的那样的扩展管道,它可能会以“错误”的顺序刷新管道,而不会比以前更确定当前的进度。最坏的情况是,在
fflush(3)
周围编写包装应该很简单。不知道如何在管道运行时执行此操作,但下一次,您可以使用unbuffer
。这避免了管道之间的缓冲。检查此链接:不确定是否有效,但您是否尝试过sync(1)
?@Shahbaz关于sync(1)
的事情是它调用sync(2)
,我的主页上写着“sync()函数强制将块缓冲缓存中的脏(修改过的)缓冲写入磁盘。”,这使得非磁盘文件不被刷新的可能性成为可能。@Shahbaz在查看了几个手册页后,我得出结论,您需要fflush(3)
和sync(2)
才能使其工作。linuxfflush(3)
页面上说“注意fflush()仅刷新C库提供的用户空间缓冲区。为确保数据物理存储在磁盘上,还必须刷新内核缓冲区,例如使用sync(2)或fsync(2)。“如果(!errno),则最好删除。如果fflush
在战争中期因任何原因失败,您可能仍然可以使用sync
刷新数据。我可以看到它的用途,但是我需要缓存错误代码,并通过错误报告的方式执行更复杂的操作。塞雷波,如果你有兴趣看的话,请告诉我:我暂时不谈这件事。与其让代码更复杂,我是否可以从终端调用sync
命令并获得同样的效果?