# File lib/phusion_passenger/preloader_shared_helpers.rb, line 94
        def run_main_loop(options)
                $0 = "Passenger AppPreloader: #{options['app_root']}"
                client = nil
                original_pid = Process.pid
                socket_filename = "#{options['generation_dir']}/backends/preloader.#{Process.pid}"
                server = UNIXServer.new(socket_filename)
                server.close_on_exec!
                
                # Update the dump information just before telling the preloader that we're
                # ready because the HelperAgent will read and memorize this information.
                LoaderSharedHelpers.dump_all_information

                puts "!> Ready"
                puts "!> socket: unix:#{socket_filename}"
                puts "!> "
                
                while true
                        # We call ::select just in case someone overwrites the global select()
                        # function by including ActionView::Helpers in the wrong place.
                        # https://code.google.com/p/phusion-passenger/issues/detail?id=915
                        ios = Kernel.select([server, STDIN])[0]
                        if ios.include?(server)
                                result, client = accept_and_process_next_client(server)
                                if result == :forked
                                        STDIN.reopen(client)
                                        STDOUT.reopen(client)
                                        STDOUT.sync = true
                                        client.close
                                        return :forked
                                end
                        end
                        if ios.include?(STDIN)
                                if STDIN.tty?
                                        begin
                                                # Prevent bash from exiting when we press Ctrl-D.
                                                STDIN.read_nonblock(1)
                                        rescue Errno::EAGAIN
                                                # Do nothing.
                                        end
                                end
                                break
                        end
                end
                return nil
        ensure
                server.close if server
                if original_pid == Process.pid
                        File.unlink(socket_filename) rescue nil
                end
        end