41 void Init(
int _fd){ fd = _fd; };
42 bool Ready(){
return(fd >= 0); };
43 virtual int FD() {
return fd; };
49 if (write (fd, &z, 1) != 1) {
57 std::streamsize
xsputn (
const char* s,
58 std::streamsize num) {
59 return write(fd,s,num);
71 int FD() {
return(buf.
FD()); };
72 int Init(
int _fd) { buf.
Init(_fd); rdbuf(&buf);
return(buf.
FD());};
89 static const int pbSize = 4;
90 static const int bufSize = 1024;
91 char buffer[bufSize+pbSize];
107 void Init(
int _fd){ fd = _fd; };
109 virtual int FD() {
return fd; };
116 if (gptr() < egptr()) {
125 numPutback = gptr() - eback();
126 if (numPutback > pbSize) {
133 memcpy (buffer+(pbSize-numPutback), gptr()-numPutback,
138 num = read (fd, buffer+pbSize, bufSize);
145 setg (buffer+(pbSize-numPutback),
162 int FD() {
return(buf.
FD()); };
163 int Init(
int _fd) { buf.
Init(_fd); rdbuf(&buf);
return(buf.
FD());};
173 InProcess(
const std::string &command) : _comline(command),_file_object(NULL)
175 _file_object = popen(_comline.c_str(),
"r");
177 Init(fileno(_file_object));
179 virtual int Execute(
const std::string &command){
181 pclose(_file_object);
182 _comline.assign(command);
183 _file_object = popen(_comline.c_str(),
"r");
185 return(
Init(fileno(_file_object)));
191 return(pclose(_file_object));
194 virtual FILE *
GetFile() {
return(_file_object); };
195 virtual std::string
Command(){
return (_comline); };
222 o_descriptors.resize(0);
223 i_descriptors.resize(0);
224 io_descriptors.resize(0);
230 const fd_set
ReadSet()
const {
return(readset); };
232 const fd_set
WriteSet()
const {
return(writeset); };
237 FD_SET(infd,&writeset);
238 if(infd > max_descriptor)
239 max_descriptor = infd;
243 FD_SET(infd,&readset);
244 if(infd > max_descriptor)
245 max_descriptor = infd;
249 FD_CLR(infd,&writeset);
253 FD_CLR(infd,&readset);
259 o_descriptors.push_back(infd);
260 SetOutDescriptor(infd);
269 i_descriptors.push_back(infd);
270 SetInDescriptor(infd);
277 io_descriptors.push_back(infd);
278 SetInDescriptor(infd);
279 SetOutDescriptor(infd);
291 FD_CLR(infd,&readset);
292 FD_CLR(infd,&writeset);
299 FD_SET(infd,&readset);
301 Set(i_descriptors,&readset);
302 Set(io_descriptors,&readset,
false);
305 template<
class FDContainer>
308 Set(fds,&readset,reset);
313 FD_SET(infd,&writeset);
315 Set(o_descriptors,&writeset);
316 Set(io_descriptors,&writeset,
false);
319 template<
class FDContainer>
327 FD_SET(infd,&readset);
328 FD_SET(infd,&writeset);
331 Set(i_descriptors,&readset);
332 Set(o_descriptors,&writeset);
333 Set(io_descriptors,&readset,
false);
334 Set(io_descriptors,&writeset,
false);
337 template<
class FDContainer>
338 void SetForIO(
const FDContainer &fds,
bool reset =
true)
340 Set(i_descriptors,&readset,reset);
341 Set(o_descriptors,&writeset,reset);
342 Set(io_descriptors,&readset,
false);
343 Set(io_descriptors,&writeset,
false);
349 retval = FD_ISSET(infd,&writeset);
351 retval += NSet(o_descriptors,&writeset);
352 retval += NSet(io_descriptors,&writeset);
360 retval = FD_ISSET(infd,&readset);
363 retval += NSet(i_descriptors,&readset);
364 retval += NSet(io_descriptors,&readset);
368 template<
class FDContainer>
371 return(NSet(fds,&writeset));
373 template<
class FDContainer>
376 return(NSet(fds,&readset));
378 int Select(
float seconds = 0.0,
bool reset =
true)
382 struct timeval *tv_ptr = NULL;
385 tv.tv_sec =
static_cast<long>(seconds);
386 tv.tv_usec =
static_cast<long>((seconds - tv.tv_sec)/usec);
393 int retval = select(max_descriptor+1,&readset,&writeset,&exset,tv_ptr);
395 perror(
"sys::FDStreamSet::Select::select");
402 struct timeval *tv_ptr = NULL;
405 tv.tv_sec =
static_cast<long>(seconds);
406 tv.tv_usec =
static_cast<long>((seconds - tv.tv_sec)/usec);
412 int retval = select(max_descriptor+1,&readset,NULL,&exset,tv_ptr);
414 perror(
"sys::FDStreamSet::Select::select");
421 struct timeval *tv_ptr = NULL;
424 tv.tv_sec =
static_cast<long>(seconds);
425 tv.tv_usec =
static_cast<long>((seconds - tv.tv_sec)/usec);
431 int retval = select(max_descriptor+1,NULL,&writeset,&exset,tv_ptr);
433 perror(
"sys::FDStreamSet::Select::select");
436 template<
class FDContainer>
437 int NSet(
const FDContainer &fds,fd_set *fdset)
440 typename FDContainer::const_iterator fdi = fds.begin();
441 while(fdi != fds.end()){
442 retval += FD_ISSET(*fdi,fdset);
447 template<
class FDContainer>
448 void Set(
const FDContainer &fds,fd_set *fdset,
bool reset =
true)
452 typename FDContainer::const_iterator fdi = fds.begin();
453 while(fdi != fds.end()){
454 int descriptor = *fdi++;
455 FD_SET(descriptor,fdset);
InProcess(const std::string &command)
int ListenForOutput(float seconds=0.0, bool reset=true)
void SetForWrite(const FDContainer &fds)
const fd_set WriteSet() const
int Select(float seconds=0.0, bool reset=true)
int ReadyForInput(const FDContainer &fds)
virtual int_type overflow(int_type c)
FDContainerType io_descriptors
int AddIODescriptor(int infd)
Defines MPI-specific parallel global and program classes.
int AddOutDescriptor(int infd)
int ReadyForOutput(const FDContainer &fds)
void ClearInDescriptor(int infd)
int AddInDescriptor(int infd)
virtual std::string Command()
virtual int_type underflow()
void SetOutDescriptor(int infd)
void SetForIO(const FDContainer &fds, bool reset=true)
const fd_set ExceptionSet() const
void SetForIO(int infd=-1)
void SetInDescriptor(int infd)
std::vector< int > FDContainerType
void SetForWrite(int infd=-1)
void Set(const FDContainer &fds, fd_set *fdset, bool reset=true)
const fd_set ReadSet() const
int ReadyForOutput(int infd=-1)
FDContainerType o_descriptors
int NSet(const FDContainer &fds, fd_set *fdset)
void ClearOutDescriptor(int infd)
virtual int Execute(const std::string &command)
void SetForRead(const FDContainer &fds, bool reset=true)
int ReadyForInput(int infd=-1)
int ListenForInput(float seconds=0.0, bool reset=true)
FDContainerType i_descriptors
virtual std::streamsize xsputn(const char *s, std::streamsize num)
void SetForRead(int infd=-1)