Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?
 
PerlMonks  

Re^4: How to pass CTRL-C to child script only

by ohmysea (Novice)
on Aug 23, 2010 at 15:32 UTC ( [id://856736]=note: print w/replies, xml ) Need Help??


in reply to Re^3: How to pass CTRL-C to child script only
in thread How to pass CTRL-C to child script only

I'm just use ing the CQLogin module in script A, so in this case I cannot use kill as there is no separate PID for script B, is that correct?

The thing is, in script B, CTRL-C will only ever be invoked during STDIN of subroutine autoLogon, so I tried to end script B during STDIN as follows:

handler:
my $stop = 0; $SIG{'INT'} = sub { $stop = 1 };
during STDIN:
print "->CQ username: "; while (<STDIN>){ if ($stop == 1){ return(0); } last; } chomp ($username = <STDIN>);
the current problem with this is that, after pressing CTRL-C, the user will have to press the enter key again to exit script B. and if the user actually wants to pass in input, the input will need to be entered twice, but I guess I will have to work around this way for this problem.

Thanks!

Replies are listed 'Best First'.
Re^5: How to pass CTRL-C to child script only
by CountZero (Bishop) on Aug 23, 2010 at 17:32 UTC
    Why don't you simply have a prompt at log-on, saying "Enter username (Q to quit)" and then test for "Q" and do what you need to do in that case?

    CountZero

    A program should be light and agile, its subroutines connected like a string of pearls. The spirit and intent of the program should be retained throughout. There should be neither too little or too much, neither needless loops nor useless variables, neither lack of structure nor overwhelming rigidity." - The Tao of Programming, 4.1 - Geoffrey James

Re^5: How to pass CTRL-C to child script only
by spazm (Monk) on Aug 24, 2010 at 03:04 UTC
    I'm just use ing the CQLogin module in script A, so in this case I cannot use kill as there is no separate PID for script B, is that correct?
    Yes, that is correct. In the situation you have described there is no child script.

    Suggestion 1:
    Set interrupt to die, then use eval to trap the die in the code. This modification could be in either the primary module or the CQLogin module, depending on if you want to change the calling contract of the CQLogin.

    Suggestion 2:
    Use a parsing module that has already anticipated and fixed these issues.

    #!/usr/bin/perl use strict; use warnings; my $INTERRUPT_MESSAGE = "caught sig int user interrupt"; $SIG{'INT'} = sub { die $INTERRUPT_MESSAGE }; my $login = new CQLogin(); my $username = eval { $login->autoLogon() }; if ( !defined $username && $@ ) { print STDERR "wow, we got a signal\n\n"; #just for demo purpose die $@ unless $@ eq $INTERRUPT_MESSAGE; } print "Success, our username is [$username]\n\n"; #note, username will be undef if the user interrupted. package CQLogin; sub new { my $class = shift; return bless {}, $class; } sub autoLogon { my $self = shift; chomp( my $username = <STDIN> ); return $username; }
      I'll explain further if you have any other questions. Please let me know if this works for you.

      The above is tested, working code. It contains an abbreviation of your autoLogon code that I hope is similar to your actual semantics.

      Some modules to consider Term::Readkey or IO::Prompter, to handle this for you.

      Another option is to put the terminal into raw mode and read characters one at a time. Abort upon finding the key currently bound to sig-int (ctrl-c). blech, what a pain that would be.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://856736]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others perusing the Monastery: (6)
As of 2024-04-16 17:56 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found