歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Unix環境產生單實例進程方案

Unix環境產生單實例進程方案

日期:2017/2/28 16:17:58   编辑:Linux教程

在一些情況下,一個進程只能產生一個實例來執行。Unix環境,提供了文件-記錄鎖(file- and record-locking)機制,提供了事項單實例進程的基本解決方案。

假如,一個進程在開始運行時,生成了一個文件,並且,對整個文件上鎖,並且,只有一個這樣的寫鎖允許生成。

如果,後續的進程要試圖產生寫鎖,會導致失敗。這暗示了,前面已經有實例運行了。

下面一個判斷是否有實例運行的方法。每個實例,都會試圖生成一個文件(/var/run/daemon.pid).如果文件已經鎖上了,lockfile方法,返回失敗,判斷函數返回1,表示進程已經運行了。如果沒有實例運行,程序,清空文件,寫入進程id,返回0.

下面為一個實現的程序:

  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <fcntl.h>
  5. #include <syslog.h>
  6. #include <string.h>
  7. #include <errno.h>
  8. #include <sys/stat.h>
  9. #define LOCKFILE "/var/run/daemon.pid"
  10. #define LOCKMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)
  11. int already_running(void);
  12. int lockfile(int );
  13. int main(int argc,char * argv[])
  14. {
  15. int val = already_running();
  16. if(val == 0)
  17. {
  18. printf("sart to running...\n");
  19. }
  20. else
  21. {
  22. printf("alredy running...\n");
  23. exit(0);
  24. }
  25. while(1)
  26. {
  27. sleep(3);
  28. printf("...\n");
  29. }
  30. return 0;
  31. }
  32. int already_running(void)
  33. {
  34. int fd;
  35. char buf[16];
  36. fd = open(LOCKFILE,O_RDWR|O_CREAT, LOCKMODE);
  37. if(fd < 0)
  38. {
  39. syslog(LOG_ERR, "can't open %s: %s", LOCKFILE, strerror(errno));
  40. exit(1);
  41. }
  42. if(lockfile(fd) < 0)
  43. {
  44. if (errno == EACCES || errno == EAGAIN)
  45. {
  46. close(fd);
  47. return 1;
  48. }
  49. syslog(LOG_ERR,"can't lock %s: %s", LOCKFILE, strerror(errno));
  50. exit(1);
  51. }
  52. ftruncate(fd,0);
  53. sprintf(buf,"%ld",(long)getpid());
  54. write(fd,buf,strlen(buf) + 1);
  55. return 0;
  56. }
  57. int lockfile(int fd)
  58. {
  59. struct flock fl;
  60. fl.l_type = F_WRLCK;
  61. fl.l_start = 0;
  62. fl.l_whence = SEEK_SET;
  63. fl.l_len = 0;
  64. return(fcntl(fd, F_SETLK, &fl));
  65. }
Copyright © Linux教程網 All Rights Reserved