Article View: pl.comp.lang.ruby
Article #730Re: Próba pisania do procesu na strumień 3,4
From: Paweł Kondzior
Date: Mon, 03 Dec 2007 16:46
Date: Mon, 03 Dec 2007 16:46
135 lines
4578 bytes
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-mailReferences:
<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