signal method

sighandler_t signal(
  1. int sig,
  2. sighandler_t func
)

Sets a function to handle a signal.

Returns the previous handler, or SIG_ERR on error.

Implementation

sighandler_t signal(int sig, sighandler_t func) {
  final previousHandler = _signalHandlers[sig] ?? SIG_DFL;

  if (func == SIG_ERR) return SIG_ERR;

  // Cleanup old subscription
  _signalSubscriptions[sig]?.cancel();
  _signalSubscriptions.remove(sig);

  _signalHandlers[sig] = func;

  if (func == SIG_DFL) {
    // Default behavior usually means terminating or ignoring depending on signal.
    // In Dart we simply stop intercepting it.
    stdlibSetSignalHandler(sig, null); // We need to handle null in stdlibSetSignalHandler or just not set
  } else if (func == SIG_IGN) {
    // Ignore it.
    final sub = stdlibSetSignalHandler(sig, (_) {});
    if (sub != null) _signalSubscriptions[sig] = sub;
  } else {
    // Custom handler
    final sub = stdlibSetSignalHandler(sig, (s) => func(s));
    if (sub != null) _signalSubscriptions[sig] = sub;
  }

  return previousHandler;
}