int process_start(const char* pidFilename) { pid_t pid; int result; char cmdline[MAX_PATH_SIZE]; char cmdfile[MAX_PATH_SIZE]; char argv0[MAX_PATH_SIZE]; int64_t cmdsz; if ((result=get_pid_from_file(pidFilename, &pid)) != 0) { if (result == ENOENT) { return 0; } else { fprintf(stderr, "get pid from file: %s fail, " \ "errno: %d, error info: %s\n", pidFilename, result, strerror(result)); return result; } } if (kill(pid, 0) == 0) { const char *exename1, *exename2; cmdsz = sizeof(cmdline); cmdline[cmdsz-1] = argv0[cmdsz-1] = '\0'; sprintf(cmdfile, "/proc/%d/cmdline", pid); if ((result=getFileContentEx(cmdfile, cmdline, 0, &cmdsz)) != 0) { fprintf(stderr, "read file %s failed. %d %s\n", cmdfile, errno, strerror(errno)); return result; } cmdsz = sizeof(argv0); sprintf(cmdfile, "/proc/%d/cmdline", getpid()); if ((result=getFileContentEx(cmdfile, argv0, 0, &cmdsz)) != 0) { fprintf(stderr, "read file %s failed. %d %s\n", cmdfile, errno, strerror(errno)); return result; } exename1 = process_get_exename(cmdline); exename2 = process_get_exename(argv0); if (strcmp(exename1, exename2) == 0) { fprintf(stderr, "process %s already running, pid: %d\n", argv0, (int)pid); return EEXIST; } return 0; } else if (errno == ENOENT || errno == ESRCH) { return 0; } else { result = errno != 0 ? errno : EPERM; fprintf(stderr, "kill pid: %d fail, errno: %d, error info: %s\n", (int)pid, errno, strerror(errno)); return result; } }
int get_pid_from_file(const char *pidFilename, pid_t *pid) { char buff[32]; int64_t file_size; int result; if (access(pidFilename, F_OK) != 0) { return errno != 0 ? errno : EPERM; } file_size = sizeof(buff) - 1; if ((result=getFileContentEx(pidFilename, buff, 0, &file_size)) != 0) { return result; } *(buff + file_size) = '\0'; *pid = strtol(buff, NULL, 10); if (*pid == 0) { return EINVAL; } return 0; }
int get_processes(struct fast_process_info **processes, int *count) { const char *dirname = "/proc"; char filename[128]; char buff[4096]; DIR *dir; struct dirent *ent; FastProcessArray proc_array; int64_t bytes; int result; int len; int i; dir = opendir(dirname); if (dir == NULL) { *count = 0; *processes = NULL; logError("file: "__FILE__", line: %d, " "call opendir %s fail, " "errno: %d, error info: %s", __LINE__, dirname, errno, STRERROR(errno)); return errno != 0 ? errno : EPERM; } result = 0; proc_array.procs = NULL; proc_array.alloc_size = 0; proc_array.count = 0; while ((ent=readdir(dir)) != NULL) { len = strlen(ent->d_name); for (i=0; i<len; i++) { if (!(ent->d_name[i] >= '0' && ent->d_name[i] <= '9')) { break; } } if (i < len) //not digital string { continue; } sprintf(filename, "%s/%s/stat", dirname, ent->d_name); bytes = sizeof(buff); if (getFileContentEx(filename, buff, 0, &bytes) != 0) { continue; } if ((result=check_process_capacity(&proc_array)) != 0) { break; } parse_proc_stat(buff, bytes, proc_array.procs + proc_array.count); proc_array.count++; } closedir(dir); *count = proc_array.count; *processes = proc_array.procs; return result; }