On Mar 14, 2014, at 8:09 AM, Kirill Müller <kirill.muel...@ivt.baug.ethz.ch> 
wrote:

> Hi
> 
> Is there a way to detect that the process that corresponds to a pipe has 
> ended? On my system (Ubuntu 13.04), I see
> 
> > p <- pipe("true", "w"); Sys.sleep(1); system("ps -elf | grep true | grep -v 
> > grep"); isOpen(p)
> [1] TRUE
> 
> The "true" process has long ended (as the filtered ps system call emits no 
> output), still R believes that the pipe p is open.
> 

As far as R is concerned, the connection is open. In addition, pipes exist even 
without the process - you can close one end of a pipe and it will still exist 
(that’s what makes pipes useful, actually, because you can choose to close 
arbitrary combination of the R/W ends). Detecting that the other end of the 
pipe has closed is generally done by sending/receiving data to/from the end of 
interest - i.e. reading from a pipe that has closed the write end on the other 
side will yield 0 bytes read. Writing to a pipe that has closed the read end on 
the other side will yield SIGPIPE error (note that for text connections you 
have to call flush() to send the buffer):

> p=pipe("true","r")
> readLines(p)
character(0)
> close(p)

> p=pipe("true","w")
> writeLines("", p)
> flush(p)
Error in flush.connection(p) : ignoring SIGPIPE signal
> close(p)

Cheers,
Simon




> Thanks for your input.
> 
> 
> Best regards
> 
> Kirill
> 
> ______________________________________________
> R-devel@r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
> 

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to