示例#1
0
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;
    }
}
示例#2
0
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;
}
示例#3
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;
}