Add a wrapper for signalfd

The wrapper blocks (and unblock) signals for the thread as well.
This will get tested by the wakeup for the IPC.

Change-Id: Ica701034e8890fc0689b8528b4d7448fd630ed64
diff --git a/aos/ipc_lib/signalfd.h b/aos/ipc_lib/signalfd.h
new file mode 100644
index 0000000..a545a80
--- /dev/null
+++ b/aos/ipc_lib/signalfd.h
@@ -0,0 +1,38 @@
+#ifndef AOS_IPC_LIB_SIGNALFD_H_
+#define AOS_IPC_LIB_SIGNALFD_H_
+
+#include <sys/signalfd.h>
+#include <sys/types.h>
+#include <initializer_list>
+
+namespace aos {
+namespace ipc_lib {
+
+// Class to manage a signalfd.
+class SignalFd {
+ public:
+  // Constructs a SignalFd for the provided list of signals.
+  // Blocks the signals at the same time in this thread.
+  SignalFd(::std::initializer_list<int> signals);
+
+  SignalFd(const SignalFd &) = delete;
+  SignalFd &operator=(const SignalFd &) = delete;
+  ~SignalFd();
+
+  // Returns the file descriptor for the signalfd.
+  int fd() { return fd_; }
+
+  // Reads a signalfd_siginfo.  If there was an error, the resulting ssi_signo
+  // will be 0.
+  signalfd_siginfo Read();
+
+ private:
+  int fd_ = -1;
+
+  sigset_t mask_;
+};
+
+}  // namespace ipc_lib
+}  // namespace aos
+
+#endif  // AOS_IPC_LIB_SIGNALFD_H_