mirror of
https://github.com/fish-shell/fish-shell
synced 2024-12-29 06:13:20 +00:00
2a4c545b21
When fish receives a "cancellation inducing" signal (SIGINT in particular) it has to unwind execution - for example while loops or whatever else that is executing. There are two ways this may come about: 1. The fish process received the signal 2. A child process received the signal An example of the second case is: some_command | some_function Here `some_command` is the tty owner and so will receive control-C, but then fish has to cancel function execution. Prior to this change, these were handled uniformly: both would just set a cancellation signal inside the parser. However in the future we will have multiple parsers and it may not be obvious which one to set the flag in. So instead distinguish these cases: if a process receives SIGINT we mark the signal in its job group, and if fish receives it we set a global variable.
62 lines
1.8 KiB
C++
62 lines
1.8 KiB
C++
// The library for various signal related issues.
|
|
#ifndef FISH_SIGNALH
|
|
#define FISH_SIGNALH
|
|
|
|
#include <signal.h>
|
|
|
|
/// Get the integer signal value representing the specified signal, or -1 of no signal was found.
|
|
int wcs2sig(const wchar_t *str);
|
|
|
|
/// Get string representation of a signal.
|
|
const wchar_t *sig2wcs(int sig);
|
|
|
|
/// Returns a description of the specified signal.
|
|
const wchar_t *signal_get_desc(int sig);
|
|
|
|
/// Set all signal handlers to SIG_DFL.
|
|
void signal_reset_handlers();
|
|
|
|
/// Set signal handlers to fish default handlers.
|
|
void signal_set_handlers(bool interactive);
|
|
|
|
/// Latch function. This sets signal handlers, but only the first time it is called.
|
|
void signal_set_handlers_once(bool interactive);
|
|
|
|
/// Tell fish what to do on the specified signal.
|
|
///
|
|
/// \param sig The signal to specify the action of
|
|
void signal_handle(int sig);
|
|
|
|
/// Ensure we did not inherit any blocked signals. See issue #3964.
|
|
void signal_unblock_all();
|
|
|
|
/// Returns signals with non-default handlers.
|
|
void get_signals_with_handlers(sigset_t *set);
|
|
|
|
/// \return the most recent cancellation signal received by the fish process.
|
|
/// Currently only SIGINT is considered a cancellation signal.
|
|
/// This is thread safe.
|
|
int signal_check_cancel();
|
|
|
|
/// Set the cancellation signal to zero.
|
|
/// In generaly this should only be done in interactive sessions.
|
|
void signal_clear_cancel();
|
|
|
|
enum class topic_t : uint8_t;
|
|
/// A sigint_detector_t can be used to check if a SIGINT (or SIGHUP) has been delivered.
|
|
class sigchecker_t {
|
|
topic_t topic_;
|
|
uint64_t gen_{0};
|
|
|
|
public:
|
|
sigchecker_t(topic_t signal);
|
|
|
|
/// Check if a sigint has been delivered since the last call to check(), or since the detector
|
|
/// was created.
|
|
bool check();
|
|
|
|
/// Wait until a sigint is delivered.
|
|
void wait() const;
|
|
};
|
|
|
|
#endif
|