1. 通过进程name获取pid
int get_process_pid(const char* chr)
{
char cmd[64] = { 0 };
int pid = 0;
FILE *file = NULL;
char buff[64] = { 0 };
sprintf(cmd, "ps -ef | grep %s | grep -v grep | awk '{print $1}'", chr);
file = popen(cmd, "r");
if (!file) {
printf("cannot open it\n");
return -1;
}
fgets(buff, sizeof(buff), file);
pid = atoi(buff);
fclose(file);
return pid;
}
int get_pid_by_name(const char* task_name)
{
int pid_value = -1;
DIR *dir;
struct dirent *ptr;
FILE *fp;
char filepath[512] = { 0 };
char cur_task_name[512] = { 0 };
char buf[1024] = { 0 };
dir = opendir("/proc");
if (NULL != dir) {
while((ptr = readdir(dir)) != NULL) {
if((strcmp(ptr->d_name, ".") == 0) || (strcmp(ptr->d_name, "..") == 0))
continue;
if(DT_DIR != ptr->d_type)
continue;
sprintf(filepath, "/proc/%s/status", ptr->d_name);
fp = fopen(filepath, "r");
if(NULL != fp) {
if(fgets(buf, 1023, fp) == NULL) {
fclose(fp);
continue;
}
sscanf(buf, "%*s %s", cur_task_name);
if (!strcmp(task_name, cur_task_name)) {
printf("PID:%s\n", ptr->d_name);
pid_value = atoi(ptr->d_name);
}
fclose(fp);
}
}
closedir(dir);
} else {
printf("open proc failed!\n");
}
return pid_value;
}
2. 通过进程name获取pid列表
int find_pids_by_name( char *ProcName, int *foundpid, int *foundnum)
{
DIR *dir = NULL;
struct dirent *d = NULL;
int pid = 0, i = 0;
char *s = NULL;
int pnlen = 0;
if ( NULL == ProcName
|| NULL == foundpid
|| NULL == foundnum )
return -1;
foundpid[0] = 0;
pnlen = strlen(ProcName);
*foundnum = 0;
/* Open the /proc directory. */
dir = opendir("/proc");
if (!dir)
{
printf("cannot open /proc");
return -1;
}
/* Walk through the directory. */
while ((d = readdir(dir)) != NULL) {
char exe[PATH_MAX_DNSMASQ+1];
char path[PATH_MAX_DNSMASQ+1];
int len;
int namelen;
/* See if this is a process */
if ((pid = atoi(d->d_name)) == 0)
continue;
snprintf(exe, sizeof(exe), "/proc/%s/exe", d->d_name);
if ((len = readlink(exe, path, PATH_MAX_DNSMASQ)) < 0)
continue;
path[len] = '\0';
/* Find ProcName */
s = strrchr(path, '/');
if(s == NULL)
continue;
s++;
/* we don't need small name len */
namelen = strlen(s);
if(namelen < pnlen)
continue;
if(!strncmp(ProcName, s, pnlen)) {
/* to avoid subname like search proc tao but proc taolinke matched */
if(s[pnlen] == ' ' || s[pnlen] == '\0') {
foundpid[i] = pid;
i++;
}
}
}
*foundnum = i;
foundpid[i] = 0;
closedir(dir);
return 0;
}