- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图用 FIFO 做一些简单的事情:读取行,但不是一次全部读取,结果出乎意料地“不起作用”。
没关系:
$ f=$(mktemp -u)
$ mkfifo $f
$ { seq 5 > $f; } &
[1] 2486
$ while read line; do echo $line; done < $f
1
2
3
4
5
[1]+ Done { seq 10 > $f; }
但如果我尝试逐行读取,第一次读取成功,第二次读取挂起。
$ { seq 5 > $f; } &
[1] 2527
$ read line < $f; echo $line
1
[1]+ Done { seq 5 > $f; }
$ read line < $f; echo $line
[hangs here...]
谁能解释一下?为什么我不能一一阅读所有 5 行?其余数据怎么了?
我发现如果我创建一个文件描述符来重定向 FIFO,我可以逐行读取:
$ { seq 5 > $f; } &
[1] 2732
$ exec 3<$f
[1]+ Done { seq 5 > $f; }
$ read -u 3 line && echo $line || echo no more data
1
$ read -u 3 line && echo $line || echo no more data
2
$ read -u 3 line && echo $line || echo no more data
3
$ read -u 3 line && echo $line || echo no more data
4
$ read -u 3 line && echo $line || echo no more data
5
$ read -u 3 line && echo $line || echo no more data
no more data
$ exec 3<&-
我还是不明白中间的场景。谁能解释一下?
版本信息:
$ bash --version
GNU bash, version 4.2.25(1)-release (i686-pc-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
$ mkfifo --version
mkfifo (GNU coreutils) 8.13
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by David MacKenzie.
最佳答案
我猜这是怎么回事:
$ read line < $f
打开 FIFO 进行读取,读取一行,然后关闭 FIFO。一旦读取器关闭其一侧的 FIFO,写入器 (seq 5 > $f
) 也会关闭。当您下次打开 FIFO 时,此时没有人写入它,所以 read
block 。
随着 while
FIFO 在 while
之前一直开放供读取命令完成,允许编写器向 FIFO 发送更多行。
您可以使用 lsof -p $$
验证在每个点打开(未打开)的文件。
关于bash - 在 shell 脚本中使用 mkfifo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23088620/
我遇到了以下代码的问题: #include #include #include #include #include int main(int argc, char*argv[]){ FILE
我有一个不断需要写入信息的进程。此外,还有第二个进程有时会连接到写入进程的“信息 channel ”,并且应该读取连接后写入的信息。此过程也可能会再次断开连接并重新连接几次。 我目前通过在我的 C++
我的 C 程序中的以下行应提供 All/Group/Owner 读写权限 mkfifo("/tmp/dumbPipe", 0666) 但是一旦我执行了代码并检查了未设置写入位的权限,我最终得到了 pr
我正在尝试使用 mkfifo 命令在 linux 下的 c 上创建一个命名管道。但是当我运行该程序时,我要么收到“没有这样的文件或目录”错误,要么什么也没有(控制台不显示任何内容) 这是我的代码: #
#include #include #include #include #include #include #include int main(void) { if(mkfifo
据我了解,根据https://linux.die.net/man/3/mkfifo , 我得到一个暗示,我必须有读取器和写入器文件,才能 利用管道文件。下面的来源是编写器文件, #include #
我有以下代码,我从 Xcode 中的 Swift 主程序调用它,例如在虚拟 iPhone 的模拟器中运行它时,它可以工作。它创建/tmp/MYFIFO。 int32_t init_udpC(void)
我在命名 Linux BASH、命名管道等方面相当陌生。我正在关注这篇文章中的一个例子: https://www.linuxjournal.com/content/using-named-pipes-
我正在编写一个脚本来设置机器环境。我有能力在机器上放置一个启动脚本,所以我试图在我的“工作站”机器上使用 unix 中的命名管道在线。 问题是,我无法控制这些机器何时可以联机。总共有 20 多台机器同
gcc (GCC) 4.7.2 c89 我正在使用管道 mkfifo。我有一个读者和一个作家。 我希望读者阻塞,直到文件中有内容。 有一个标志可以设置为非阻塞模式的 O_NONBLOCK。所以默认情况
我使用 mkfifo 创建命名管道。然后我使用下面的程序打开它。但是,程序卡在“fopen”行。这里有什么问题吗? int main(int argc, char** argv) { char* li
我想执行一个 bash 脚本来执行以下操作: 应用程序“ffmpeg”生成一个实时传输流 (.ts) 文件。我需要处理这个实时流(执行解复用等)。 现在我知道这必须通过 FIFO 来完成;但这是我的任
我正在使用命名管道来捕获另一个程序 (MATLAB) 中的外部程序 (wgrib2) 的输出。 MATLAB 代码如下,system()访问命令行以制作管道: system('mkfifo myfif
我已经尝试调试这个问题几个小时了,但我仍然卡住了...... 我在这段代码中遇到了“mkfifo”调用的段错误(它只是我整个代码的一部分,因为我认为其余部分与这里无关): #include "mark
我有一个动态加载的库,可以计算一个特殊值。我的程序需要访问该值(在 C 或 C++ 中)。我想到了命名管道。但他们对于这个目的似乎有些奇怪。如果通过管道实现,我的库会在文件中写入一个值,然后我的程序会
我正在尝试用 C 创建命名管道,但没有成功。 这是我的代码: pid_t pid = getpid() ; char * pipeNameo = malloc( sizeof(char) * 100
我正在尝试用 C 创建命名管道,但没有成功。 这是我的代码: #define FIFO_NAME "/tmp/myfifo" int main(){ int fd; fd = mkfi
我正在尝试编写两个使用 fifo 管道相互通信的程序。我使用了例子here (第 5.2 节),但我将那里的 mknod 更改为 mkfifo 并尝试将 gets 更改为 fgets。这是代码(写入
我试图用 FIFO 做一些简单的事情:读取行,但不是一次全部读取,结果出乎意料地“不起作用”。 没关系: $ f=$(mktemp -u) $ mkfifo $f $ { seq 5 > $f; }
我使用 mkfifo 创建命名管道。然后我用下面的程序打开它。但是,程序在“fopen”行挂起。这里有什么问题吗? int main(int argc, char** argv) { char* li
我是一名优秀的程序员,十分优秀!