stdin/stdout/stderr problem in g++ and rails

In my rails controller, I am doing the following :

@output = `g++ j.cpp -o "prog" && ./prog`

This gives the output in the @output variable which i can display in my view. But the above works only if the j.cpp is correct and doesn't expect any user input. How can I use the stdin/stderr and stdout streams here so that :

If the user has to give input, I open a dialog box on the view with a textfield where he/she can enter the input, and the program continues to execute. If there are any errors in the file, then I should be able to get the errors and display them to the user. I tried doing this :

@output = `g++ j.cpp -o "prog" && ./prog| tee prog`

This allows me to enter the user input at the server command prompt (the server log...i don't know what do we call it), but I want it to be entered in a textfield in the view. Help me.

In my rails controller, I am doing the following :

@output = `g++ j.cpp -o "prog" && ./prog`

This gives the output in the @output variable which i can display in my view. But the above works only if the j.cpp is correct and doesn't expect any user input. How can I use the stdin/stderr and stdout streams here so that :

If the user has to give input, I open a dialog box

Sorry, can't help you there, at least nothing springs immediately to my mind.

If there are any errors in the file, then I should be able to get the errors and display them to the user. I tried doing this :

@output = `g++ j.cpp -o "prog" && ./prog| tee prog`

There's probably some more Rubyish way to do it by messing with the definitions of stout and stderr, but a quick and dirty way to do it, by messing with the the command line to make stderr go to stdout, is:

@output = `g++ j.cpp -o "prog" 2&>1`

Check $? to see if it succeeded (should be 0; make sure you check IMMEDIATELY after the command). if so, then you can run prog as normal.

This is an old shell-scripting type kluge that I wasn't sure would work, but does. Proof-of-concept code:

#! /usr/bin/ruby out = `ls -l #{ARGV.join ' '} 2>&1` status = $? puts "command %sed (status %d)" % [(status == 0 ? 'work' : 'fail'), status] puts out # insert your own joke here, folks!

Also be VERY careful about how you are feeding the program name into the command, especially if there's any way a user can influence it. Google "SQL Injection"; it's not just for SQL.

-Dave