コード例 #1
0
 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);
 }
コード例 #2
0
ファイル: UnixSignalTest.cs プロジェクト: raj581/Marvin
 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
     }
 }
コード例 #3
0
ファイル: Program.cs プロジェクト: razzmatazz/sdb
        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);
        }
コード例 #4
0
ファイル: CommandLine.cs プロジェクト: razzmatazz/sdb
        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);
            }
        }
コード例 #5
0
ファイル: Program.cs プロジェクト: pauldotknopf/apt-tool
        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));
        }
コード例 #6
0
ファイル: CommandLine.cs プロジェクト: razzmatazz/sdb
        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();
            }
        }