从命名管道读取连续数据
Reading continuous data from a named pipe
我一直在尝试从命名管道读取连续数据。但出于某种原因,如果我不延迟,接收器将停止读取,并且在几个样本后只显示空白屏幕。
我需要发送可能以毫秒为单位发生变化的连续数据,因此延迟不起作用。我试图首先使用 while 循环来模拟它(真正的脚本将读取财务数据)。这是我的第一次尝试:
这是发件人,一个python脚本:
import os
import time
try:
os.remove("/tmp/pipe7") # delete
except:
print "Pipe already exists"
os.mkfifo("/tmp/pipe7") # Create pipe
x = 0
while True:
x = time.time()
pipe = open("/tmp/pipe7", "w")
line = str(x) + "\r\n[=10=]"
pipe.write(line)
pipe.close()
#time.sleep(1)
os.remove("/tmp/pipe7") # delete
这是C/C++中的接收器:
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <iostream>
#include <sys/stat.h>
#define MAX_BUF 1024
using namespace std;
int main()
{
while(1){
char buf[MAX_BUF];
memset (buf, 0, sizeof(buf)); //Clearing the message buffer
int fd = open("/tmp/pipe7", O_RDONLY); // Open the pipe
read(fd, buf, MAX_BUF); // Read the message - unblock the writing process
cout << buf << endl;
close(fd); // Close the pipe
}
return 0;
}
我的方法有什么问题?使用管道在两个程序之间连续通信的最佳方式是什么?
首先,您不需要为每个 I/O 操作 open/close 管道。 最终您可能需要在每次写入后刷新输出。
然后,当您输出基于行的文本数据时,您不能真正依赖固定宽度的读取来取回您的数据。鉴于你的例子,我会简单地读入一个字符串 - istream
应该读到下一个空白(这里 \n\r
)
所有这些都导致了类似的东西(未经测试——小心错别字!):
with open("/tmp/pipe7", "w") as pipe:
while True:
x = time.time()
line = str(x) + "\r\n"
pipe.write(line)
pipe.flush()
# in real code, should somehow break the loop at some point
std::ifstream pipe("/tmp/pipe7"); // Open the pipe
while(1){
std::string istr;
pipe >> istr;
cout << istr << endl;
# In real code, should somehow break the loop at some point
}
close(fd);
operator >>
超载以从 istream 读取字符串。在这种情况下,它将从流中提取字符,并在遇到空白字符或遇到流结尾时立即停止。从广义上讲,这允许回读输入 "word by word".
我一直在尝试从命名管道读取连续数据。但出于某种原因,如果我不延迟,接收器将停止读取,并且在几个样本后只显示空白屏幕。
我需要发送可能以毫秒为单位发生变化的连续数据,因此延迟不起作用。我试图首先使用 while 循环来模拟它(真正的脚本将读取财务数据)。这是我的第一次尝试:
这是发件人,一个python脚本:
import os
import time
try:
os.remove("/tmp/pipe7") # delete
except:
print "Pipe already exists"
os.mkfifo("/tmp/pipe7") # Create pipe
x = 0
while True:
x = time.time()
pipe = open("/tmp/pipe7", "w")
line = str(x) + "\r\n[=10=]"
pipe.write(line)
pipe.close()
#time.sleep(1)
os.remove("/tmp/pipe7") # delete
这是C/C++中的接收器:
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <iostream>
#include <sys/stat.h>
#define MAX_BUF 1024
using namespace std;
int main()
{
while(1){
char buf[MAX_BUF];
memset (buf, 0, sizeof(buf)); //Clearing the message buffer
int fd = open("/tmp/pipe7", O_RDONLY); // Open the pipe
read(fd, buf, MAX_BUF); // Read the message - unblock the writing process
cout << buf << endl;
close(fd); // Close the pipe
}
return 0;
}
我的方法有什么问题?使用管道在两个程序之间连续通信的最佳方式是什么?
首先,您不需要为每个 I/O 操作 open/close 管道。 最终您可能需要在每次写入后刷新输出。
然后,当您输出基于行的文本数据时,您不能真正依赖固定宽度的读取来取回您的数据。鉴于你的例子,我会简单地读入一个字符串 - istream
应该读到下一个空白(这里 \n\r
)
所有这些都导致了类似的东西(未经测试——小心错别字!):
with open("/tmp/pipe7", "w") as pipe:
while True:
x = time.time()
line = str(x) + "\r\n"
pipe.write(line)
pipe.flush()
# in real code, should somehow break the loop at some point
std::ifstream pipe("/tmp/pipe7"); // Open the pipe
while(1){
std::string istr;
pipe >> istr;
cout << istr << endl;
# In real code, should somehow break the loop at some point
}
close(fd);
operator >>
超载以从 istream 读取字符串。在这种情况下,它将从流中提取字符,并在遇到空白字符或遇到流结尾时立即停止。从广义上讲,这允许回读输入 "word by word".