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;
}
因篇幅问题不能全部显示,请点此查看更多更全内容