bug-readline
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Use of rl_echo_signal_char in _rl_handle_signal


From: Andrew Burgess
Subject: Re: Use of rl_echo_signal_char in _rl_handle_signal
Date: Wed, 07 Jun 2023 13:52:17 +0100

Chet Ramey <chet.ramey@case.edu> writes:

> On 6/1/23 6:40 AM, Andrew Burgess wrote:
>> 
>> This email originated as a conversation on the GDB list, which can be
>> found here:
>> 
>>    
>> https://inbox.sourceware.org/gdb-patches/20230518061046.17837-1-tdevries@suse.de/
>> 
>> The problem that was observed was that sometimes during testing GDB
>> would print '^C', but most of the time this would not happen.
>> 
>> The '^C' is printed from rl_echo_signal_char.
>> 
>> What normally happens is that the user types a character, GDB sees the
>> character appear on stdin and calls into readline to process the
>> character.  Once completed readline returns to GDB to await the next
>> event.  In this case the next event is the user typing 'Ctrl+c' which
>> sends SIGINT.  GDB's signal handler catches this and does its thing.
>
> This works fine if the application supplies its own signal handlers, like
> GDB does. There are lots of applications that use readline that don't, but
> would still like to see the signal characters. These are usually the ones
> that set rl_persistent_signal_handlers, but not always. Making the change
> you suggest woul break those apps in an incompatible way, with no way to
> get their desired behavior.

Thanks for pointing that out, I was not aware of this setting.

>
>> The documentation for rl_echo_signal_char says:
>> 
>>       If an application wishes to install its own signal handlers, but
>>       still have readline display characters that generate signals,
>>       calling this function with SIG set to 'SIGINT', 'SIGQUIT', or
>>       'SIGTSTP' will display the character generating that signal.
>> 
>> I would also make the assumption that, when readline is used in callback
>> mode, the application spends most of its time with the applications
>> signal handlers installed, and only installs readline's handlers
>> occasionally.
>
> This is a good assumption for GDB, but not for other applications. Several
> interactive python applications, for instance, don't install their own
> signal handlers at all, and rely on readline's signal handlers entirely.
>
> What do you suggest? Conditionalizing this behavior on whether or not
> rl_persistent_signal_handlers is set? Having readline set a flag if it
> prints the signal char info?

I did some experimentation at my end and updated my sample program to
make use of rl_persistent_signal_handlers.  I agree with your first
suggestion, having the rl_echo_signal_char call conditional on
rl_persistent_signal_handlers (when in CALLBACK mode) seems to allow for
both options.

Again, I'm happy to share my sample programs if that helps at all.

There's an updated patch below.

Thanks,
Andrew

---

commit c212adc4bb6357545ec3fe1326128dfc25821e6b
Author: Andrew Burgess <aburgess@redhat.com>
Date:   Thu Jun 1 11:21:04 2023 +0100

    readline: don't always call rl_echo_signal_char in callback mode
    
    This patch was a result of some GDB work that is discussed in this
    thread:
    
      
https://inbox.sourceware.org/gdb-patches/20230518061046.17837-1-tdevries@suse.de/
    
    In callback mode, and if rl_persistent_signal_handlers is off, then
    most signals will be delivered directly to the applications signal
    handler.  If the application wants to see the signal char then the
    application will take care of calling rl_echo_signal_char.
    
    However, readline currently always calls rl_echo_signal_char for
    signals seen within readline, this means that if a happens to arrive
    at the right/wrong moment then rl_echo_signal_char will always be
    called, whether the application calls this itself or not.
    
    In callback mode when rl_persistent_signal_handlers is on then the
    readline signal handler is always in place for the duration of the
    readline prompt being in use.  In this case it does make sense to
    always call rl_echo_signal_char.  By the time the application's signal
    handler is invoked we are on the way out of readline, and it is no
    longer the applications job to call rl_echo_signal_char.
    
    In non-callback mode, this patch changes nothing, rl_echo_signal_char
    is always called.

diff --git a/signals.c b/signals.c
index ec835e5..0df184d 100644
--- a/signals.c
+++ b/signals.c
@@ -267,7 +267,11 @@ _rl_handle_signal (int sig)
        sigprocmask (SIG_BLOCK, &set, &oset);
 #endif
 
-      rl_echo_signal_char (sig);
+#if defined (READLINE_CALLBACKS)
+      if (rl_persistent_signal_handlers)
+#endif
+       rl_echo_signal_char (sig);
+
       rl_cleanup_after_signal ();
 
       /* At this point, the application's signal handler, if any, is the




reply via email to

[Prev in Thread] Current Thread [Next in Thread]