项目作者: recp

项目描述 :
Signal/Event handling lib for C/C++
高级语言: C++
项目地址: git://github.com/recp/libsig.git
创建时间: 2014-08-28T11:12:58Z
项目社区:https://github.com/recp/libsig

开源协议:MIT License

下载


libsig

Signal/Event handling lib for C/C++

Build Status

ligsig is a signal/event library for C and C++ which allows to handling
signals/events like observer pattern. Member functions also
can be used as callbacks.

Each signal has a signal context which allows that signals can be used in their own
context.
Also the system signals such as SIGPIPE… can be observed in system context
(sig_sys_ctx) ).

Predefined contexts:

  1. // sig_attach/sig_detach/sig_fire functions
  2. // use the default ctx if there is no specified one
  3. const sig_context_t * sig_ctx_default();
  4. // sistem signals can be observed by using this ctx
  5. const sig_context_t * sig_ctx_sys();

Alloc and free custom contexts:

  1. const sig_context_t * sig_ctx_new();
  2. void sig_ctx_free(const sig_context_t * ctx);

For C:

The functions are overloaded by _s postfix (and c postfix for custom contexts):

  1. /*
  2. For all (or full) declerations (especially for custom ctx)
  3. look at the sig.h header
  4. */
  5. /* Observe a signal by signal name or id */
  6. void sig_attach(int signal, sig_observer_cb_t cb);
  7. void sig_attach_s(const char * signal, sig_observer_cb_t cb);
  8. /* Stop observe a signal by signal name or id */
  9. void sig_detach(int signal, sig_observer_cb_t cb);
  10. void sig_detach_s(const char * signal, sig_observer_cb_t cb);
  11. /* Fire a signal by signal name or id */
  12. void sig_fire(int signal, void * object);
  13. void sig_fire_s(const char * signal, void * object);

For C++:

  1. /*
  2. For all (or full) declerations (especially for custom ctx)
  3. look at the sig.h header
  4. */
  5. /* Observe a signal by signal name or id */
  6. void sig_attach(int signal, sig_observer_cb_t cb);
  7. void sig_attach(const char * signal, sig_observer_cb_t cb);
  8. // For member functions
  9. void sig_attach(int signal, sig_slot(T *, Func));
  10. void sig_attach(const char * signal, sig_slot(T *, Func));
  11. // -------------------------------------------------------
  12. /* Stop observe a signal by signal name or id */
  13. void sig_detach(int signal, sig_observer_cb_t cb);
  14. void sig_detach(const char * signal, sig_observer_cb_t cb);
  15. // For member functions
  16. void sig_detach(int signal, sig_slot(T *, Func));
  17. void sig_detach(const char * signal, sig_slot(T *, Func));
  18. // Detach all observers from the object/instance
  19. void sig_detach(void * observer);
  20. void sig_detach(void * observer, const sig_context_t * ctx);
  21. // -------------------------------------------------------
  22. /* Fire a signal by signal name or id */
  23. void sig_fire(int signal, void * object);
  24. void sig_fire(const char * signal, void * object);

Signals also can be observed or can be fired by the following style for C++:

  1. /* Observe a signal */
  2. sig::attach[1234] << fn_callback1 ... ;
  3. sig::attach["signal_name"] << fn_callback1 << fn_callback2 ...;
  4. /* Stop observe */
  5. sig::detach[1234] >> fn_callback1 ...;
  6. sig::detach["signal_name"] >> fn_callback1 >> fn_callback2 ...;
  7. /* Fire (trigger) a signal */
  8. sig:fire["signal_name"] << (void *)"Signal object (void *)";

Build

Unix / Macintosh

  1. $ sh autogen.sh
  2. $ ./configure
  3. $ make
  4. $ [sudo] make install

Windows

  1. $ msbuild libsig.vcxproj /p:Configuration=Release

Sample

  1. #include <iostream>
  2. #include <signal.h>
  3. #include <sig.h>
  4. #define CUSTOM_NTF1 123
  5. class TestClass {
  6. public:
  7. TestClass() {
  8. sig_attach(CUSTOM_NTF1,
  9. sig_slot(this, &TestClass::memberFn));
  10. sig_attach("custom_ntf2",
  11. sig_slot(this, &TestClass::memberFn));
  12. // Attach / Observe system signals
  13. sig_attach(SIGUSR1,
  14. sig_slot(this, &TestClass::memberFn),
  15. sig_ctx_sys());
  16. }
  17. void memberFn(const sig_signal_t sig) {
  18. // Do somethings...
  19. std::cout << "notification (TestClass): "
  20. << (const char *)sig.object
  21. << std::endl;
  22. }
  23. void stopObserveNtf1() {
  24. sig_detach(CUSTOM_NTF1,
  25. sig_slot(this, &TestClass::memberFn));
  26. }
  27. ~TestClass() {
  28. sig_detach(this);
  29. }
  30. };
  31. // non-member function
  32. void do_somethings(const sig_signal_t signal) {
  33. std::cout << "notification (do_somethings): "
  34. << (const char *)signal.object
  35. << std::endl;
  36. }
  37. int main() {
  38. // Observe a signal/event
  39. sig_attach("signal-1", do_somethings);
  40. // Fire signal
  41. sig_fire("signal-1", (void *)"signal-1 object");
  42. // Test Member functions
  43. TestClass t1;
  44. sig_fire(CUSTOM_NTF1, (void *)"ntf 1 object");
  45. t1.stopObserveNtf1();
  46. sig_fire(CUSTOM_NTF1, (void *)"ntf 1 object");
  47. sig_fire("custom_ntf2", (void *)"ntf 2 object");
  48. raise(SIGUSR1);
  49. return 0;
  50. }

Output:

  1. notification (do_somethings): signal-1 object
  2. notification (TestClass): ntf 1 object
  3. notification (TestClass): ntf 2 object
  4. notification (TestClass):