🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.ruby
Article #730

Re: Próba pisania do procesu na strumień 3,4

#730
From: Paweł Kondzior
Date: Mon, 03 Dec 2007 16:46
135 lines
4578 bytes
Nie mozesz otworzyc IO na File Descriptor 3 i 4 poniewaz takie nie 
istnieja (patrz http://en.wikipedia.org/wiki/File_descriptor)

Mysle ze masz bledne zalorzenia co do sposobu wymiany tych danych. Co 
dokladnie probujesz osiagnac w taki sposob ?


Dnia 12/3/07 8:12 AM, Jan Koprowski napisał(a):
> Dałem sobie radę z poprzednim probleme. Programik po prostu nie czytał
> z stdin-a i nic na niego nie należało pisać. Teraz największy problem
> jest z tym, żeby wysłać coś na strumienie 3,4. Obecny kod:
> 
> class Broker_process
> 
>   READ = 0  # Consts to explicite mark read
>   WRITE = 1 # and write pipes
> 
>   STDLOG = IO.new(3, "w")
>   STDPAS = IO.new(4, "w")
> 
>   @stdin  # Stdin    stream
>   @stdout # Stdout   stream
>   @stderr # Stderr   stream
>   @stdlog # Login    stream
>   @stdpas # Password stream
> 
>   @login  # Login administrator
>   @password # Password administrator
> 
>   @pid # Process handler
> 
>   # Set credentials for user
>   def self.set_credentials(login, password)
>     @login = login
>     @password = password
>   end
> 
>   # Log into broker by set credentials
>   def self.send_credentials()
>     @stdlog[WRITE].write @login
>     @stdlog[WRITE].close
>     @stdpas[WRITE].write @password
>     @stdpas[WRITE].close
>   end
> 
>   # Make pipes to communicate with child.
>   # Each pipe is array of two: read and write pipe.
>   def self.make_pipes()
>       @stdin  = IO.pipe()
>       @stdout = IO.pipe()
>       @stderr = IO.pipe()
>       @stdlog = IO.pipe()
>       @stdpas = IO.pipe()
>   end
> 
>   # Close unused pipes from parent site
>   def self.close_unused_pipes
>       @stdin[READ].close
>       @stdout[WRITE].close
>       @stderr[WRITE].close
>       @stdlog[READ].close
>       @stdpas[READ].close
>   end
> 
>   # Prepare and run child process
>   def self.run_child(command)
>     @stdin[WRITE].close
>     STDIN.reopen(@stdin[READ])
>     @stdin[READ].close
> 
>     @stdout[READ].close
>     STDOUT.reopen(@stdout[WRITE])
>     @stdout[WRITE].close
> 
>     @stderr[READ].close
>     STDERR.reopen(@stderr[WRITE])
>     @stderr[WRITE].close
> 
>     @stdlog[WRITE].close
>     STDLOG.reopen(@stlog[READ])
>     @stdlog[READ].close
> 
>     @stdpas[WRITE].close
>     STDPAS.reopen(@stdpas[READ])
>     @stdpas[READ].close
> 
>     exec(*command) # Replace by command binary code
> 
>     exit!
>   end
> 
>   # Run process
>   def self.run(command, params)
>     self.make_pipes()
>     if fork
>       self.close_unused_pipes()
>       self.send_credentials()
>       @stdin[WRITE].write params
>       @stdin[WRITE].close
>       Process.wait
>       out = @stdout[READ].read
>       @stdout[READ].close
>       err = @stderr[READ].read
>       @stderr[READ].close
>       puts out
>     else
>       self.run_child(command)
>     end
>   end
> 
> end
> 
> Wywala się w tym miejscu:
> 
>   STDLOG = IO.new(3, "w")
>   STDPAS = IO.new(4, "w")
> 
> Być może Ruby nie przewiduje otwierania kolejnych strumieni :/ Jeżeli
> tylko stworzę pipy programik testowy napisany w C też tego nie łyka. A
> oto kod programiku:
> 
> #include <stdio.h>
> #include <unistd.h>
> 
> int main() {
> 	char user[101];
> 	char pass[101];
> 	int i;
> 	read(3, user, 101);
> 	read(4, pass, 101);
> 	printf("Login: %s\nHaslo: %s\n", user, pass);
> 	return 0;
> }
> 
> Proszę bardzo o pomoc !
Technical Details
Message-ID: <fj1c01$32t$1@atlantis.news.tpi.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news.internetia.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mail
References: <eaafb9ab-1802-446b-8dec-3056066d0659@e6g2000prf.googlegroups.com> <b91380e9-574a-440e-9505-ba907dd0b846@a39g2000pre.googlegroups.com>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news.internetia.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mail
From: Paweł Kondzior <kondzior.p@gmail.com>
Newsgroups: pl.comp.lang.ruby
Subject: Re: Próba pisania do procesu na
 strumień 3,4
Date: Mon, 03 Dec 2007 17:46:33 +0100
Organization: tp.internet - http://www.tpi.pl/
Lines: 135
Message-ID: <fj1c01$32t$1@atlantis.news.tpi.pl>
References: <eaafb9ab-1802-446b-8dec-3056066d0659@e6g2000prf.googlegroups.com> <b91380e9-574a-440e-9505-ba907dd0b846@a39g2000pre.googlegroups.com>
NNTP-Posting-Host: dsl-out.exorigo.pl
Mime-Version: 1.0
X-Trace: atlantis.news.tpi.pl 1196700481 3165 83.19.133.162 (3 Dec 2007 16:48:01 GMT)
X-Complaints-To: usenet@tpi.pl
NNTP-Posting-Date: Mon, 3 Dec 2007 16:48:01 +0000 (UTC)
User-Agent: Thunderbird 2.0.0.9 (Macintosh/20071031)
In-Reply-To: <b91380e9-574a-440e-9505-ba907dd0b846@a39g2000pre.googlegroups.com>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit