আমি এর মতো কয়েকটি প্রোগ্রাম একত্রিত করার চেষ্টা করছি (দয়া করে কোনও অতিরিক্ত অন্তর্ভুক্ত উপেক্ষা করুন, এটি ভারী কাজ চলছে):
pv -q -l -L 1 < input.csv | ./repeat <(nc "host" 1234)
যেখানে পুনরাবৃত্তি প্রোগ্রামের উত্সটি নীচে দেখায়:
#include <fcntl.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/epoll.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <iostream>
#include <string>
inline std::string readline(int fd, const size_t len, const char delim = '\n')
{
std::string result;
char c = 0;
for(size_t i=0; i < len; i++)
{
const int read_result = read(fd, &c, sizeof(c));
if(read_result != sizeof(c))
break;
else
{
result += c;
if(c == delim)
break;
}
}
return result;
}
int main(int argc, char ** argv)
{
constexpr int max_events = 10;
const int fd_stdin = fileno(stdin);
if (fd_stdin < 0)
{
std::cerr << "#Failed to setup standard input" << std::endl;
return -1;
}
/* General poll setup */
int epoll_fd = epoll_create1(0);
if(epoll_fd == -1) perror("epoll_create1: ");
{
struct epoll_event event;
event.events = EPOLLIN;
event.data.fd = fd_stdin;
const int result = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fd_stdin, &event);
if(result == -1) std::cerr << "epoll_ctl add for fd " << fd_stdin << " failed: " << strerror(errno) << std::endl;
}
if (argc > 1)
{
for (int i = 1; i < argc; i++)
{
const char * filename = argv[i];
const int fd = open(filename, O_RDONLY);
if (fd < 0)
std::cerr << "#Error opening file " << filename << ": error #" << errno << ": " << strerror(errno) << std::endl;
else
{
struct epoll_event event;
event.events = EPOLLIN;
event.data.fd = fd;
const int result = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fd, &event);
if(result == -1) std::cerr << "epoll_ctl add for fd " << fd << "(" << filename << ") failed: " << strerror(errno) << std::endl;
else std::cerr << "Added fd " << fd << " (" << filename << ") to epoll!" << std::endl;
}
}
}
struct epoll_event events[max_events];
while(int event_count = epoll_wait(epoll_fd, events, max_events, -1))
{
for (int i = 0; i < event_count; i++)
{
const std::string line = readline(events[i].data.fd, 512);
if(line.length() > 0)
std::cout << line << std::endl;
}
}
return 0;
}
আমি এটি লক্ষ্য করেছি:
- আমি যখন পাইপটি কেবল ব্যবহার করি তখন
./repeat
সমস্ত কিছুই ইচ্ছাকৃতভাবে কাজ করে। - আমি যখন কেবল প্রক্রিয়া প্রতিস্থাপন ব্যবহার করি তখন সমস্ত কিছু উদ্দেশ্য হিসাবে কাজ করে।
- আমি যখন প্রক্রিয়া প্রতিস্থাপন ব্যবহার করে পিভিকে encapsulate করি তখন সমস্ত কিছু উদ্দেশ্য হিসাবে কাজ করে।
- তবে, যখন আমি নির্দিষ্ট নির্মাণ ব্যবহার করি, আমি স্টিডিনের ডেটা (স্বতন্ত্র অক্ষরগুলি) হারিয়ে ফেলব বলে মনে হয়!
আমি নিম্নলিখিত চেষ্টা করেছি:
- আমি পাইপটিতে বাফারিং নিষ্ক্রিয় করার চেষ্টা করেছি
pv
এবং সমস্ত প্রক্রিয়া./repeat
ব্যবহার করেছিলামstdbuf -i0 -o0 -e0
, তবে এটি কার্যকর হবে বলে মনে হয় না। - আমি জরিপের জন্য এপল পরিবর্তন করেছি, কাজ করে না।
- আমি যখন
pv
এবং এর./repeat
সাথে প্রবাহটি দেখি তখন এটিtee stream.csv
সঠিক দেখাচ্ছে। - আমি যা দেখছিলাম
strace
তা দেখতে পেয়েছি এবং আমি প্রচুর একক বাইট পড়ে দেখলাম (যেমনটি প্রত্যাশা করা হয়েছিল) এবং তারা এও দেখায় যে ডেটা হারিয়ে যাচ্ছে।
আমি ভাবছি কি হচ্ছে? বা আরও তদন্ত করতে আমি কী করতে পারি?
<(...)
? এর চেয়েও সুন্দর উপায় আছে<( 0<&- ...)
?