大佬教程收集整理的这篇文章主要介绍了Linux C启动时创建pid文件,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
程序在启动时将pid写入文件,当程序再次启动时会进行检测,避免启动多个实例。
util-pidfile.h文件
1 #ifndef __UTIL_PID_H__ 2 #define __UTIL_PID_H__ 3 4 int PidfileCreate(const char *); 5 void PidfileRemove(const char *); 6 int PidfileTestRunning(const char *pid_filename); 7 8 #endif /* __UTIL_PID_H__ */
util-pidfile.c文件
1 #include <stdio.h> 2 #include <inttypes.h> // PRIuMAX 3 #include <errno.h> // errno 4 #include <string.h> // strerror 5 6 #include <sys/types.h> 7 #include <sys/stat.h> 8 #include <fcntl.h> 9 #include <unistd.h> // getpid 10 #include <signal.h> // kill 11 12 #include "util-debug.h" 13 #include "util-pidfile.h" 14 15 /** 16 * \brief Write a pid file (used at the startup) 17 * This commonly needed by the init scripts 18 * 19 * \param pointer to the name of the pid file to write (optarg) 20 * 21 * \retval 0 if succes 22 * \retval -1 on failure 23 */ 24 int PidfileCreate(const char *pidfile) 25 { 26 int pidfd = 0; 27 char val[16]; 28 29 int len = snprintf(val,sizeof(val),"%"PRIuMAX"\n",(uintmax_t)getpid()); 30 if (len <= 0) { 31 LogError("Pid error (%s)",strerror(errno)); 32 return(-1); 33 } 34 35 pidfd = open(pidfile,O_CREAT | O_TRUNC | O_nofollow | O_WRONLY,0644); 36 if (pidfd < 0) { 37 LogError("unable to set pidfile ‘%s‘: %s", 38 pidfile, 39 strerror(errno)); 40 return(-1); 41 } 42 43 ssize_t r = write(pidfd,val,(unsigned int)len); 44 if (r == -1) { 45 LogError("unable to write pidfile: %s",strerror(errno)); 46 close(pidfd); 47 return(-1); 48 } else if ((size_t)r != len) { 49 LogError("unable to write pidfile: wrote" 50 " %"PRIdMAX" of %"PRIuMAX" bytes.",(intmax_t)r,(uintmax_t)len); 51 close(pidfd); 52 return(-1); 53 } 54 55 close(pidfd); 56 return(0); 57 } 58 59 /** 60 * \brief Remove the pid file (used at the startup) 61 * 62 * \param pointer to the name of the pid file to write (optarg) 63 */ 64 void PidfileRemove(const char *pid_filename) 65 { 66 if (pid_filename != NULL) { 67 /* we ignore the result,the user may have removed the file already. */ 68 (void)unlink(pid_filename); 69 } 70 } 71 72 /** 73 * \brief Check a pid file (used at the startup) 74 * This commonly needed by the init scripts 75 * 76 * \param pointer to the name of the pid file to write (optarg) 77 * 78 * \retval 0 if succes 79 * \retval -1 on failure 80 */ 81 int PidfileTestRunning(const char *pid_filename) 82 { 83 if (access(pid_filename,F_OK) == 0) { 84 /* Check if the existing process is still alive. */ 85 pid_t pidv; 86 FILE *pf; 87 88 pf = fopen(pid_filename,"r"); 89 if (pf == NULL) { 90 LogError("pid file ‘%s‘ exists and can not be read. Aborting!", 91 pid_filename); 92 return -1; 93 } 94 95 if (fscanf(pf,"%d",&pidv) == 1 && kill(pidv,0) == 0) { 96 fclose(pf); 97 LogError("pid file ‘%s‘ exists. Is program already running? Aborting!", 98 pid_filename); 99 return -1; 100 } 101 102 fclose(pf); 103 } 104 return 0; 105 }
util-debug.h日志打印(主要是为了方便以后使用其他打印接口,就不用再修改util-pidfile.c文件了)
1 #ifndef __UTIL_DEBUG_H__ 2 #define __UTIL_DEBUG_H__ 3 4 #ifndef LOG_PRINT 5 #define LOG_MAX_LOG_MSG_LEN 2048 6 #define Log(x,file,func,line,...) 7 do { 8 char _log_msg[LOG_MAX_LOG_MSG_LEN]; 9 snprintf(_log_msg,LOG_MAX_LOG_MSG_LEN,__VA_ARGS__); 10 fprintf(stdout,"<%s> %s\n",x,_log_msg); 11 } while(0) 12 13 #define LogError(...) Log("ERROR",14 __FILE__,__FUNCTION__,__LINE__,__VA_ARGS__) 15 16 #define LogWarning(...) Log("WARNING",17 __FILE__,__VA_ARGS__) 18 19 #define LogInfo(...) Log("INFO",20 __FILE__,__VA_ARGS__) 21 22 #define LogDebug(...) Log("DEBUG",23 __FILE__,__VA_ARGS__) 24 25 #define FatalError(...) do { 26 LogError(__VA_ARGS__); 27 exit(EXIT_FAILURE); 28 } while(0) 29 #endif 30 31 32 #endif //__UTIL_DEBUG_H__
main.c文件
1 #include <stdio.h> 2 #include <unistd.h> 3 4 #include "util-pidfile.h" 5 6 7 int main() 8 { 9 int result = 0; 10 11 const char *pidfile = "/var/run/test_pid01.pid"; 12 13 if (PidfileTestRunning(pidfile) != 0) 14 return -1; 15 16 PidfileCreate(pidfile); 17 18 while (1){ 19 sleep(1); 20 } 21 22 PidfileRemove(pidfile); 23 return 0; 24 }
编译完成后运行该程序,然后再启动一个终端,再次运行这个程序的时候就会打印程序已运行并退出。
<ERROR> pid file ‘/var/run/test_pid01.pid‘ exists. Is program already running? Aborting!
以上是大佬教程为你收集整理的Linux C启动时创建pid文件全部内容,希望文章能够帮你解决Linux C启动时创建pid文件所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。