internal static void SetUnixSignalAction(Signum signal, SignalAction action) { // This seemingly pointless method adds some // indirection so that we don't load `Mono.Posix` // unless we absolutely need to. Stdlib.SetSignalAction(signal, action); }
public void TestSignalActionInteraction() { using (UnixSignal a = new UnixSignal(Signum.SIGINT)) { Stdlib.SetSignalAction(Signum.SIGINT, SignalAction.Ignore); Stdlib.raise(Signum.SIGINT); Assert.AreEqual(a.Count, 0); // never invoked } }
static int Main(string[] args) { var version = false; var help = false; var batch = false; var rc = true; var files = new List <string>(); var p = new OptionSet() { { "v|version", "Show version information and exit.", v => version = v != null }, { "h|help", "Show this help message and exit.", v => help = v != null }, { "b|batch", "Exit after running commands.", v => batch = v != null }, { "n|norc", "Don't run commands in '~/.sdb.rc'.", v => rc = v == null }, { "f|file=", "Execute commands in the given file at startup.", f => files.Add(f) } }; List <string> cmds; try { cmds = p.Parse(args); } catch (OptionException ex) { Console.WriteLine(ex.Message); return(1); } var ver = typeof(Program).Assembly.GetName().Version; if (version) { Console.WriteLine("Mono soft debugger (sdb) {0}", ver); return(0); } if (help) { Help(p); return(0); } // This ugly hack is necessary because we don't want the // debuggee to die if the user hits Ctrl-C. We set our signal // disposition to `SIG_IGN` so that the debuggee inherits // this and doesn't die. if (!Utilities.IsWindows && !batch) { Stdlib.SetSignalAction(Signum.SIGINT, SignalAction.Ignore); } CommandLine.Run(ver, batch, rc, cmds, files); return(0); }
internal static void UnsetControlCHandler() { if (Utilities.IsWindows) { Console.CancelKeyPress -= ConsoleControlCHandler; _windowsConsoleHandlerSet = false; } else if (_signalThread != null) { _signalThread.Abort(); _signalThread.Join(); _signalThread = null; Stdlib.SetSignalAction(Signum.SIGINT, SignalAction.Ignore); } }
static int Main(string[] args) { // Bug starting gzip within process, see this: https://blog.nelhage.com/2010/02/a-very-subtle-bug/ Stdlib.SetSignalAction(Signum.SIGPIPE, SignalAction.Default); return(Parser.Default.ParseArguments <Commands.Install.Command, Commands.GenerateRootFs.Command, Commands.Man.Command, Commands.DownloadChangelogs.Command, Commands.DebianSecurityAudit.Command>(args) .MapResult( (Commands.Install.Command opts) => Commands.Install.Run(opts), (Commands.GenerateRootFs.Command opts) => Commands.GenerateRootFs.Run(opts), (Commands.Man.Command opts) => Commands.Man.Run(opts), (Commands.DownloadChangelogs.Command opts) => Commands.DownloadChangelogs.Run(opts), (Commands.DebianSecurityAudit.Command opts) => Commands.DebianSecurityAudit.Run(opts), errs => 1)); }
internal static void SetControlCHandler() { if (Utilities.IsWindows) { if (!_windowsConsoleHandlerSet) { Console.CancelKeyPress += ConsoleControlCHandler; } _windowsConsoleHandlerSet = true; } else if (_signalThread == null) { Stdlib.SetSignalAction(Signum.SIGINT, SignalAction.Default); _signalThread = new Thread(() => { try { using (var sig = new UnixSignal(Signum.SIGINT)) { while (true) { sig.WaitOne(); ControlCHandler(); } } } catch (ThreadAbortException) { } }); _signalThread.Start(); } }