Articles of fifo

linux FIFO中的数据似乎丢失了

我有一个bash脚本,它想要并行执行一些工作,我通过将每个作业放在后台运行的子shell中来完成。 虽然同时运行的作业数量应该受到一定的限制,但是我通过首先在FIFO中插入一些行,然后在分割子shell之前,需要父脚本从这个FIFO中读取一行。 只有获得一条线后,才能分叉子壳。 到目前为止,一切正常。 但是当我试图从子shell中的FIFO中读取一行时,似乎只有一个子shell可以获得一行,即使在FIFO中显然有更多的行。 所以我想知道为什么其他子shell不能读取一行,即使在FIFO中有更多的行。 我的testing代码看起来像这样: #!/bin/sh fifo_path="/tmp/fy_u_test2.fifo" mkfifo $fifo_path #open fifo for r/w at fd 6 exec 6<> $fifo_path process_num=5 #put $process_num lines in the FIFO for ((i=0; i<${process_num}; i++)); do echo "$i" done >&6 delay_some(){ local index="$1" echo "This is what u can see. $index \n" sleep 20; } #In each iteration, […]

读取中间值时双向fifo通信块

我正在尝试使用fifo在两个进程之间来回发送信息。 它工作到一个点,但后来一个阅读块。 我怀疑Process2是错误的地方。 处理1: #include<fcntl.h> #include<sys/types.h> #include<sys/stat.h> main() { char oprtr; int fd1,fd0; float oprnd1,oprnd2,result; mkfifo("fifo1",0777); fd1=open("fifo1",O_RDWR); printf("fd1:%d\n",fd1); printf("Add(+)\n"); printf("subtract(-)\n"); printf("multiply(*)\n"); printf("division(/)\n"); printf("Enter operator\n"); scanf("%c",&oprtr); getchar(); write(fd1,&oprtr,sizeof(oprtr)); printf("Enter oprnd1\n"); scanf("%f",&oprnd1); getchar(); write(fd1,&oprnd1,sizeof(oprnd1)); fd0=dup(fd1); printf("Enter oprnd2\n"); scanf("%f",&oprnd2); getchar(); if(write(fd0,&oprnd2,sizeof(oprnd2))==0) perror("write : oprnd2:"); else printf("writing oprnd2 done\n"); read(fd1,&result,sizeof(result)); printf("Result:%f\n",result); } 过程2: #include<fcntl.h> #include<sys/types.h> #include<sys/stat.h> main() { int […]

先进先出grep文件

我正在使用命名pipe道来捕获系统日志消息。 然后,我可以通过做类似的事情轻松地查看系统日志 cat /var/log/local3.pipe | grep somefilter or grep somefilter /var/log/local3.pipe 这两个都很好地输出syslog到控制台。 但是,如果我然后想要捕获到一个文件,我什么也得不到,例如 cat /var/log/local3.pipe | grep somefilter >> somefile.log or grep somefilter /var/log/local3.pipe >> somefile.log 该文件始终保持为零字节。 有谁知道为什么? 我正在使用红帽企业Linux 5.谢谢。 附加信息:对于任何想要复制这里的命令的完整列表 su <enter root password> mkfifo /var/log/local3.pipe chmod 644 /var/log/local3.pipe echo "local3.* |/var/log/local3.pipe" >> /etc/syslog.conf /etc/init.d/syslog restart exit 然后用一个ssh会话: cat /var/log/local3.pipe 并在第二个SSH会话(“testing”应显示在第一个SSH会话 logger -p local3.info […]

如何在Linux中创build大小的FIFO缓冲区?

具体来说,我试图从设备捕获audio或videostream,并按下button时只保留X分钟(或Y MBytes)。 任何本地的方式来做到这一点在Linux? 我知道fifo,但只是保留所有的数据。 我想pipe我的stream到一个特定的缓冲区,只保留最后的Y MBytes,并丢弃其余的。 谢谢

在awk的BASH shell中使用bc作为守护进程

# mkfifo inp out # bc -ql <inp >out & [1] 6766 # # exec 3>inp 4<out # echo "scale=3; 4/5;" >&3 # read a <&4; echo $a .800 # # awk ' BEGIN { printf("4/5\n") >"/dev/fd/3"; exit 1;} ' # read a <&4; echo $a .800 # # awk ' BEGIN { printf("4/5\n") >"/dev/fd/3"; […]

打开命名pipe道用于写入并在select()中使用它

我的总体目标是将报告信息传递到命名pipe道,如果(并且只有)有读取器连接到该命名pipe道。 如果没有阅读器,我想避免构build报告信息等。由于这是发生在其他数据stream通过select()处理的情况下,我想添加命名的pipe道到“准备写入”。 所以,我想打开一个命名pipe道进行写入,并且需要以select()方式将其提供给select() ,以便在命名pipe道的另一端确实存在读取器的情况下,仅返回select() 。 通常,如果没有阅读器, open呼叫已经挂起; 不幸的是,我不能给一个open动作select() – 只打开文件描述符是有效的。 为了得到一个体面的文件描述符,我正在创build一个虚拟阅读器(我打开命名pipe道阅读自己),然后打开写入,然后closures虚拟阅读器: dummy = os.open(fifoPath, os.O_RDONLY | os.O_NONBLOCK) # ^^^ without the NONBLOCK, this will hang until another process is ready to write fifo = os.open(fifoPath os.O_WRONLY) os.close(dummy) 如果我现在打开另一个读者,他会收到我写入命名pipe道的内容,所以这方面正在工作。 但是现在select()总是返回fifo作为ready-to-write,即使没有阅读器连接: r, w, e = select.select([], [ fifo ], []) print w[0] 这会一直打印fifo值。 写入命名pipe道也不会挂起,不pipe我写了多less: fifo.write('foo') 我写的数据只是丢失,因为没有阅读器连接。 当打开我的虚拟阅读器,我传递的标志O_NONBLOCK […]

在* nix系统中创build临时命名的fifo

我有一些任务需要大量的临时命名pipe道来处理。 最初,我只是简单地认为生成随机数字,然后将其附加为<number>.fifo是命名pipe道的名称。 但是,我发现这个职位: 在Python中创build一个临时的FIFO(命名pipe道)? 看来有些东西我不知道,可能会导致一些安全问题。 所以我的问题是,什么是最好的方式来生成命名pipe道? 请注意,尽pipe我引用了一个Python相关的post,但我并不是只想用Python来提问。 更新: 因为我想用一个命名pipe道来连接不相关的进程,所以我的计划是先通过shell调用进程B,然后捕获stdout来获取pipe道的名字,然后都知道要打开什么。 在这里,我只是担心是否泄漏pipe道的名称将成为一个问题。 之前我从来没有想过,直到我读了Python的post。

如何从pipe道文件返回?

使用mkfifo命令,我们可以创build我们的pipe道文件。 之后,我使用vim编辑器打开该文件。 mkfifo pipe_file vim pipe_file 但我不能回到我的terminal,我怎么能回到terminal?

如何使用FIFO等待某人写入和阅读?

作为标题,我使用C在Linux系统的两个程序之间做这个工作。 但是,我遇到了一些问题。 假设我有一台服务器在十个循环内向FIFO写入数据,客户端将读取每一轮的数据,并写入另一个FIFO以反馈给服务器。 客户端将在每一轮阻塞,直到服务器编写器的数据,但是,我的客户端程序不能做到这一点。 我用fopen打开FIFO和fgets来读取数据。 似乎不阻止等待数据写入。 客户代码: FILE *fp_R,*fp_W; char temp[100]; fp_R = fopen(FIFO_R,"rb"); fp_W = fopen(FIFO_W,"wb"); for ( i = 0 ; i < 10 ; i ++ ) { fgets(temp, 100, fp_R); Handle Data; fprintf(fp_W,DATA); } 我想fgets等待服务器写入数据,以便我可以处理每一轮 感谢任何人的帮助

FIFO文件和读/写

我一直试图在周一的实验室之前对FIFO和这个低级I / O有一些了解,而我也遇到了这种情况,我不太明白。 该计划应该: 服务器: 创buildFIFO, 发送5条消息:“消息#i”,间隔5秒, 删除FIFO, 客户: 从FIFO中读取并显示消息, 终止如果没有味精6秒, 然而它确实沟通了,客户端显示的并不是我送给他的东西,更重要的是,每当新消息到达时,似乎都是从头开始阅读。 我一直在试图弄清,相当长一段时间,这似乎不符合文件说…请帮助! 🙁 服务器 #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <string.h> #include <sys/stat.h> #include <unistd.h> int main(int argc, char* argv[]) { int s2c, c2s, i; char fifo_name1[] = "/tmp/fifo1"; char fifo_name2[] = "/tmp/fifo2"; char msg[80], buf[10]; struct stat st; // if no fifos, […]