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

WEB邮件程序

开发平台:

C/C++

  1. /*
  2. ** Copyright 1998 - 1999 Double Precision, Inc.  See COPYING for
  3. ** distribution information.
  4. */
  5. /* $Id */
  6. #include "liblock.h"
  7. #if USE_FCNTL
  8. #include "lockfcntl.c"
  9. #endif
  10. #if USE_FLOCK
  11. #include "lockflock.c"
  12. #endif
  13. #if USE_LOCKF
  14. #include "locklockf.c"
  15. #endif
  16. #include <signal.h>
  17. #include <stdlib.h>
  18. int main()
  19. {
  20. int fd[2];
  21. pid_t p;
  22. int s;
  23. int f;
  24. signal(SIGCHLD, SIG_DFL);
  25. if (pipe(fd))
  26. {
  27. perror("pipe");
  28. return (1);
  29. }
  30. if ((p=fork()) == (pid_t)-1)
  31. {
  32. perror("fork");
  33. return (1);
  34. }
  35. if (p == 0)
  36. {
  37. char c;
  38. close(fd[1]);
  39. read(fd[0], &c, 1);
  40. close(fd[0]);
  41. if ((f=open("conftest.lock", O_RDWR|O_CREAT, 0644)) < 0)
  42. {
  43. perror("open");
  44. exit(1);
  45. }
  46. alarm(5);
  47. if (ll_lockfd(f, ll_writelock, 0, 0))
  48. {
  49. close(f);
  50. exit(0);
  51. }
  52. close(f);
  53. exit(1);
  54. }
  55. if ((f=open("conftest.lock", O_RDWR|O_CREAT, 0644)) < 0)
  56. {
  57. perror("open");
  58. exit(1);
  59. }
  60. if (ll_lockfd(f, ll_writelock, 0, 0))
  61. {
  62. perror("lock");
  63. close(f);
  64. exit(1);
  65. }
  66. close(fd[1]);
  67. close(fd[0]);
  68. while (wait(&s) != p)
  69. ;
  70. if (s == 0)
  71. exit(0);
  72. exit(1);
  73. }