• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Auf eine Keyboardeingabe warten

byron1778

Hacker
Hallo Forum,

ich muss folgendes programmieren.

Ein Perlscript horcht auf einen Port und waehrend es horcht soll der User jederzeit eine Message eingeben koennen oder ebenso abbrechen koennen; dh. der User soll zB: nur c druecken koennen und dann eine neue Message eingeben koennen.
Leider weiss ich nur nicht, wie ich das bewerkstelligen koennte.

Ich hab mir folgendes zusammengeschustert.
Den wichtigen Teil ( so denke ich es ) habe ich hervorgehoben.

Code:
#!/bin/perl

use lib "/etc/orc/scripts/Perl";
use deapi;
#use ReadKey;

my ($user,$password,$hostname,$port,$msgtxt);
$hostname="localhost";
$port="xxx";
$user="xxx";
$password="xxx";
$api=deapi->new($user,$password,$hostname,$port);

while ( 1 ) {
$msgtxt="";
if ( $#ARGV < 2 ) {
print "Please enter message text:\n";$msgtxt=<STDIN>;chomp($msgtxt);
}
else {
  ($user,$password,$msgtxt) = @ARGV;
}

[color=red]if ( $msgtxt eq "" ) {
        print "Listening...\n";
        while ( $msgtxt eq "" ) {
                my $answer=$api->receive_async();
                if ( $answer ne "" ) {
                        print "\n$answer\n";
                }
                sysread(STDIN,$msgtxt,1);
#               ReadKey 1
        }} [/color]else {


$api->send("$msgtxt");
my $answer=$api->receive();
print "\n$answer\n";
        }
}

# logout
$api->send("{message_info={message_type=logout}}");

Wenn mir jemand vll. helfen koennte?

Danke vielmals !
 
OP
B

byron1778

Hacker
Ich antworte mir einmal selber

So habe ich das Problem vorerst geloest
Code:
#!/bin/perl

use lib "/etc/orc/scripts/Perl";
use deapi;
use Term::ReadKey;

my ($user,$password,$hostname,$port,$msgtxt);
$hostname="localhost";
$port="xxx";
$user="xxx";
$password="xxx";
$api=deapi->new($user,$password,$hostname,$port);

system("/bin/stty raw < /dev/tty");

while ( 1 ) {
$msgtxt="";
if ( $#ARGV < 2 ) {
  print "Please enter message text:\n";$msgtxt=<STDIN>;chomp($msgtxt);
}
else {
  ($user,$password,$msgtxt) = @ARGV;
}

if ( $msgtxt eq "" ) {
        print "Listening...\n";
        while ( $msgtxt eq "" ) {
                my $answer=$api->receive_async();
                if ( $answer ne "" ) {
                        print "\n$answer\n";
                }
                #sysread(STDIN,$msgtxt,1);
                $msgtxt=ReadKey(-1);
        }
} else {
.
.
.

Jetzt habe ich das Problem, sobald er mit system in den raw - Modus wechselt komme ich natuerlich nicht mehr hinaus, weil er nicht die Enter - Taste mehr erkennt und ich will den Benutzer auch nicht zumuten, dass er die Enter - Taste simuliert.

Weiss jemand, wie ich aus dem raw - Modus wieder aussteigen kann vll und das Programm aber normal weiterlaeuft?

Danke vielmals !
 
Oben