1. 直接遍历/proc目录
int find_pid_by_name( char* pidname, pid_t *pidlist)
{
#define READ_BUF_SIZE 256
DIR *dir;
struct dirent *next;
int i = 0;
dir = opendir("/proc");
if (!dir)
{
printf("Cannot open /proc");
}
while ((next = readdir(dir)) != NULL)
{
FILE *status;
char filename[READ_BUF_SIZE];
char buffer[READ_BUF_SIZE];
char name[READ_BUF_SIZE];
/* Must skip ".." since that is outside /proc */
if (strcmp(next->d_name, "..") == 0)
continue;
/* If it isn't a number, we don't want it */
if (!isdigit(*next->d_name))
continue;
sprintf(filename, "/proc/%s/status", next->d_name);
if (! (status = fopen(filename, "r")) )
{
continue;
}
if (fgets(buffer, READ_BUF_SIZE-1, status) == NULL)
{
fclose(status);
continue;
}
fclose(status);
/* Buffer should contain a string like "Name: binary_name" */
sscanf(buffer, "%*s %s", name);
if (strcmp(name, pidname) == 0)
{
pidlist[i++] = strtol(next->d_name, NULL, 0);
}
}
return i;
}
int is_cap_running()
{
pid_t pid_list[128];
if(find_pid_by_name("capSrv", pid_list) > 1)
{
printf("capSrv already run, pid:%u
",
(pid_list[0] == getpid()) ? pid_list[1] : pid_list[0]);
return 1;
}
else
{
return 0;
}
}
2. 调用pidof
char buf[256] = {0};
int pos = 0;
pid_t cur_pid = getpid();
char *cmd = "pidof capSrv";
FILE *file = popen(cmd, "r");
while(fgets(buf, 256, file) != NULL)
{
printf("%s fgets: %s
", cmd, buf);
if(isdigit(buf[0]))
{
pclose(file);
if(sscanf(buf,"%u %u", &pid[0],pid[1]) == 2)
{
printf("capSrv already run, pid:%u
", (pid[0] == cur_pid) ? pid[1] : pid[0]);
return 1;
}
else
{
return 0;
}
}
}
3. ps