Yes, this is exactly what happens. The typical solution is to send the output of the program to a file when you run it. Example:
./myprogram > somefile &
(The & runs the command in the background from the start, so you don't have to suspend it and restart it in the background with bg). Note that this sends only the standard output (stdout) of myprogram to somefile; if myprogram also writes error/diagnostic information (to stderr) then you need to capture this as well, via
./myprogram >& somefile &
If you wish to see how myprogram is progressing at any point, just "cat somefile", or do "tail -f somefile" to see everything being output in realtime. Of course, you can Ctrl-C the tail command if you want your shell back, and myprogram continues to run in the background.
Note that I'm describing commands for tcsh; if you're shell is bash, then I believe the redirect is slightly different for capturing stderr as well as stdout. Perhaps something like (not quite so sure on this one; I don't use bash much):
./myprogram &> somefile &
Do "man tcsh" or "man bash" for fancier uses of redirecting; if you don't want the output at all you can send it to /dev/null; you can also split the stderr and stdout streams to two separate files, and all that jazz, should you so desire.