liblock.h
上传用户:s81996212
上传日期:2007-01-04
资源大小:722k
文件大小:3k
源码类别:

WEB邮件程序

开发平台:

C/C++

  1. /* $Id: liblock.h,v 1.4 2000/04/26 22:31:10 mrsam Exp $ */
  2. #ifndef liblock_h
  3. #define liblock_h
  4. /*
  5. ** Copyright 1998 - 1999 Double Precision, Inc.  See COPYING for
  6. ** distribution information.
  7. */
  8. #ifdef __cplusplus
  9. extern "C" {
  10. #endif
  11. #include <sys/types.h>
  12. #if HAVE_CONFIG_H
  13. #include "config.h"
  14. #endif
  15. #define ll_whence_start 0
  16. #define ll_whence_curpos 1
  17. #define ll_whence_end 2
  18. #define ll_readlock 0
  19. #define ll_writelock 4
  20. #define ll_unlock 8
  21. #define ll_wait 16
  22. int ll_lockfd(int, /* File descriptor */
  23. int, /* ll_ bitmask */
  24. LL_OFFSET_TYPE, /* Start */
  25. LL_OFFSET_TYPE); /* Length */
  26. /* Some useful macros: ll_lock_ex - exclusive lock on a file,
  27. ll_lock_ex_test - attempt an exclusive lock on a file
  28. ll_unlock_ex - unlock a file
  29. */
  30. #define ll_lock_ex(f)
  31. ll_lockfd( (f), ll_writelock|ll_whence_start|ll_wait, 0, 0)
  32. #define ll_lock_ex_test(f)
  33. ll_lockfd( (f), ll_writelock|ll_whence_start, 0, 0)
  34. #define ll_unlock_ex(f)
  35. ll_lockfd( (f), ll_unlock|ll_whence_start, 0, 0)
  36. /*
  37. ** Value-added: functions that reliably start and stop a daemon process,
  38. ** permitting only one daemon process running.  Utilizes a lock file, and a
  39. ** pidfile.
  40. */
  41. int ll_daemon_start(const char *lockfile);
  42. void ll_daemon_started(const char *pidfile, int fd);
  43. int ll_daemon_resetio();
  44. int ll_daemon_stop(const char *lockfile, const char *pidfile);
  45. int ll_daemon_restart(const char *lockfile, const char *pidfile);
  46. /*
  47.   The basic scenario
  48. main()
  49. {
  50.     if ((fd=ll_daemon_start(lockfilename)) < 0)
  51.     {
  52.            error();  exit(1);
  53.     }
  54.     ... Some custom initialization here ...
  55.     ll_daemon_started(pidfile, fd);
  56.     ll_daemon_resetio();   ... this one is optional
  57. }
  58. To stop this daemon:
  59. ll_daemon_stop (lockfilename, pidfile)
  60. ll_daemon_start attempts to start a daemon process going.  It does only
  61. a partial setup.  If it detects that the daemon process is already
  62. running, it itself does an exit(0), not returning to the parent.
  63. If there was a failure starting a daemon process, -1 is return, else
  64. we return a transparent file descriptor, which will have to be passed as
  65. the secodn argument to ll_daemon_started().
  66. When ll_daemon_start returns, we're already running in a partially set-up
  67. daemon process.  The setup isn't complete just yet.  The parent function
  68. can perform any other custom initialization.  If initialization fails,
  69. the parent function can simply exit.  Otherwise, if the initialization
  70. completes, ll_daemon_started must be called in order to save this daemon
  71. process's pid in the pid file (2nd arg must be the return from ll_daemon_start.
  72. To stop a daemon process, simply call ll_daemon_stop.  Nothing too
  73. sophisticated here.
  74. To send the daemon process a SIGHUP, call ll_daemon_restart.
  75. */
  76. #ifdef __cplusplus
  77. } ;
  78. #endif
  79. #endif