您的当前位置:首页Linux进程相关常用函数

Linux进程相关常用函数

2023-01-18 来源:小侦探旅游网
int GetSelfProcessName(char *name, int len)
{
	char path[1024];
	memset(path, 0, sizeof(path));
	if(readlink("/proc/self/exe", path, sizeof(path) - 1) <= 0)
	{
		return 0;
	}
 
	char *pName = strrchr(path, '/' ); 
	if (pName != NULL && path + strlen(path) > pName + 2)
	{
		if (strlen(pName + 1) > len)
			return 0;
		else
		{
			strcpy(name, pName + 1);
			return strlen(name);
		}
	}
	else
	{
		return 0;
	}
}

int get_self_process_arg(char *arg, int len)
{
    FILE *pFile;
    char path[1024], proc[1024];

    memset(proc, 0, sizeof(proc));
    if (readlink("/proc/self/exe", proc, sizeof(proc) - 1) <= 0) {
        return -1;
    }

    memset(path, 0, sizeof(path));
    snprintf(path, sizeof(path) - 1, "/proc/%d/cmdline", getpid());
    if ((pFile = fopen(path, "r")) == NULL){
        return -1;
    }

    int i = 0, j = 0;
    while (1) {
        int ch = fgetc(pFile);

        if (ch == EOF) {
            break;
        }

        if (ch == 0x00) {
            ch = ' ';
        }

        if (i < strlen(proc)) {
            i++;
            continue;
        }

        if (j < len) {
            arg[j++] = (char)ch;
        }
    }
    
    fclose(pFile);

    return j;
}
int get_process_name_by_id(int pid, char *name, int size)
{
    char filename[64];
    sprintf(filename, "/proc/%d/stat", pid);
 
    FILE *file = fopen(filename, "r");
    if (file == NULL) {
        perror("fopen");
        return -1;
    }
 
    char buffer[1024];
    size_t filesize = fread(buffer, sizeof(char), sizeof(buffer) - 1, file);
    buffer[filesize] = '\0';
 
    fclose(file);
 
    char *p = strrchr(buffer, '(');
    if (p == NULL) {
        printf("Process name not found.\n");
        return -1;
    }
    p++;
    
    int len = 0;
    while (*p != ')' && len < size)
    {
        *name++ = *p++;
        len++;
    }

    *name = '\0';
    
    return len;
}
int is_proc_exist(const char *pszProcName, int nProcNameLen)
{
    DIR           *pstDir;
    struct dirent *pstEntry;
    FILE          *pfFile;
    int   nRetVal = 0, nProID;
    char           szFileName[PATH_MAX + 1];
    int            nCH, nReadIdx;

    if ((pstDir = opendir("/proc")) == NULL) {
        perror(NULL);
        printf("error para in %s(), in file %s, line %d\r\n", __FUNCTION__, __FILE__, __LINE__ - 3);
        return 0;
    }

__lblReadNextDir:
    if ((pstEntry = readdir(pstDir)) == NULL)
        goto __lblEnd;

    // 只有数字开头的目录才保存着系统进程信息
    if (pstEntry->d_name[0] < '0' || pstEntry->d_name[0] > '9')
        goto __lblReadNextDir;

    // 打开该目录下的"cmdline"文件
    nProID = atoi(pstEntry->d_name);
    memset(szFileName, 0, sizeof(szFileName));
    sprintf(szFileName, "/proc/%d/cmdline", nProID);
    if ((pfFile = fopen(szFileName, "r")) == NULL)
        goto __lblReadNextDir;

    // 判断是否匹配
    nReadIdx = 0;
    while (1) {
        nCH = fgetc(pfFile);
        if (nCH == EOF) {
            break;
        }

        if (((char)nCH) == 0x00)	// 命令行参数中的空格在cmdline文件中是空字符
            nCH = ' ';

		if (nReadIdx < nProcNameLen)
		{
			if (((char)nCH) == (char)pszProcName[nReadIdx]) {
				nReadIdx++;
			} else {
				break;
			}
		} else {
			nReadIdx++;
		}
    }

	fclose(pfFile);

	if (nReadIdx == nProcNameLen + 1) {	// cmdline文件中自动为命令行参数追加了一个空字符
		nRetVal = nProID;
		goto __lblEnd;
	} else {
	    goto __lblReadNextDir;
	}

__lblEnd:
    closedir(pstDir);
    return nRetVal;
}

因篇幅问题不能全部显示,请点此查看更多更全内容