fork download
  1. // my_parcel_restart : parcellite が起動しているか監視し、していなければ起動する
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <unistd.h>
  6.  
  7. #define APP_NAME "my_parcel_restart"
  8. #define CHECK_INTERVAL (2) // 何秒おきにチェックするか
  9. #define NO_KIDOU_LEN (1) // TEMP_FILEの1行目(pid)がこれ未満の文字長だったら
  10. // processが起動していないとみなす
  11. #define TEMP_FILE "/tmp/"APP_NAME".tmp"
  12.  
  13. //------------------------------------------------------------------------------
  14. // TEMP_FILEから1行読み込む
  15. // [in] d : 入れ先
  16. // s : 入れ先のサイズ
  17. // [out] 0 : 正常終了
  18. // 1 : file open error
  19. // 2 : 1行も無かった
  20. // 3 : 引数エラー
  21. //------------------------------------------------------------------------------
  22. int get_one_line(char *d, int s)
  23. {
  24. FILE *fp;
  25. int len;
  26. if (d == NULL || s < 2) {
  27. return 3;
  28. }
  29. if (NULL == (fp = fopen(TEMP_FILE, "r"))) {
  30. return 1;
  31. }
  32. if (NULL == fgets(d, s, fp)) {
  33. fclose(fp);
  34. return 2;
  35. }
  36. fclose(fp);
  37. len = strlen(d);
  38. if (len) {
  39. if (d[len - 1] == '\n') {
  40. len--;
  41. d[len] = '\0';
  42. }
  43. }
  44. if (len < 1) {
  45. return 2;
  46. }
  47. return 0;
  48. }
  49.  
  50. //------------------------------------------------------------------------------
  51. // 指定した名前のプロセスの起動状況を返す
  52. // 0 : 起動していない
  53. // 1 : 1個起動している
  54. // 2 : 2個以上起動している
  55. //------------------------------------------------------------------------------
  56. int count_kidou(char *proc_name)
  57. {
  58. char buff[256] = "pidof ";
  59. strcat(buff, proc_name);
  60. strcat(buff, " > " TEMP_FILE);
  61. system(buff);
  62. if (get_one_line(buff, sizeof(buff))) {
  63. return 0;
  64. }
  65. if (NO_KIDOU_LEN > strlen(buff)) {
  66. return 0;
  67. }
  68. if (NULL != strstr(buff, " ")) {
  69. return 2;
  70. }
  71. return 1;
  72. }
  73.  
  74. //------------------------------------------------------------------------------
  75. // main
  76. //------------------------------------------------------------------------------
  77. int main()
  78. {
  79. int res;
  80. // title
  81. fprintf(stderr, "\n" APP_NAME " : parcellite が起動しているか監視し、していなければ起動する\n\n");
  82. // 自分起動チェック
  83. if (count_kidou(APP_NAME) > 1) {
  84. fprintf(stderr, " すでに自分(" APP_NAME ")が起動していた\n");
  85. return 0;
  86. }
  87. // mugen loop
  88. while (1) {
  89. res = count_kidou("parcellite");
  90. switch (res) {
  91. case 0: // parcellite が起動していない
  92. // parcellite を起動
  93. system("parcellite &");
  94. break;
  95. case 1: // parcellite が1個起動中
  96. break;
  97. case 2: // parcellite が複数起動していた
  98. // 現在の parcellite を全て kill して 新しい parcellite を起動
  99. system("kill -9 $(pidof parcellite) ; parcellite &");
  100. break;
  101. default:
  102. break;
  103. }
  104. sleep(CHECK_INTERVAL);
  105. }
  106. // end
  107. return 0;
  108. }
  109.  
Time limit exceeded #stdin #stdout #stderr 5s 2420KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
my_parcel_restart : parcellite が起動しているか監視し、していなければ起動する

sh: cannot create /tmp/my_parcel_restart.tmp: Permission denied
sh: pidof: not found
sh: cannot create /tmp/my_parcel_restart.tmp: Permission denied
sh: pidof: not found
sh: parcellite: not found
sh: cannot create /tmp/my_parcel_restart.tmp: Permission denied
sh: pidof: not found
sh: parcellite: not found
sh: cannot create /tmp/my_parcel_restart.tmp: Permission denied
sh: pidof: not found
sh: parcellite: not found
sh: cannot create /tmp/my_parcel_restart.tmp: Permission denied
sh: pidof: not found
sh: parcellite: not found
sh: cannot create /tmp/my_parcel_restart.tmp: Permission denied
sh: pidof: not found
sh: parcellite: not found
sh: cannot create /tmp/my_parcel_restart.tmp: Permission denied
sh: pidof: not found
sh: parcellite: not found