当前位置: 技术问答>linux和unix
如何查找指定进程的PID,通过编程解决?
来源: 互联网 发布时间:2016-01-23
本文导语: 已知所要查找的进程肯定在运行之中。 如何通过编程得知该进程的pid号。 最好有C或C++代码作为例子,谢谢!! 系统是linux FC5。 | 看我这段代码能否达到楼主的要求: ------------------------...
已知所要查找的进程肯定在运行之中。
如何通过编程得知该进程的pid号。
最好有C或C++代码作为例子,谢谢!!
系统是linux FC5。
如何通过编程得知该进程的pid号。
最好有C或C++代码作为例子,谢谢!!
系统是linux FC5。
|
看我这段代码能否达到楼主的要求:
-----------------------------------------------------------
int find_pid_by_name(vector &vec_proid, char* pidName)
{
DIR *dir;
struct dirent *next;
int i=0;
dir = opendir("/proc");
if (!dir)
{
fprintf(stderr, "Cannot open /procn");
return -999;
}
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;
}
/* Read first line in /proc/?pid?/status */
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)
{
printf("PID:[%d][%s]n", strtol(next->d_name, NULL, 0), next->d_name);
vec_proid.push_back(strtol(next->d_name, NULL, 0));
}
}
return 0;
}
-----------------------------------------------------------
-----------------------------------------------------------
int find_pid_by_name(vector &vec_proid, char* pidName)
{
DIR *dir;
struct dirent *next;
int i=0;
dir = opendir("/proc");
if (!dir)
{
fprintf(stderr, "Cannot open /procn");
return -999;
}
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;
}
/* Read first line in /proc/?pid?/status */
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)
{
printf("PID:[%d][%s]n", strtol(next->d_name, NULL, 0), next->d_name);
vec_proid.push_back(strtol(next->d_name, NULL, 0));
}
}
return 0;
}
-----------------------------------------------------------
|
遍历/proc目录下的每一个数字命名的子目录,每一个子目录是一个进程的相关信息,其中文件cmdline包含进程所运行的程序文件名
例如/proc/1/cmdline包含的是
init
例如/proc/1/cmdline包含的是
init
|
1. 用waitpid可以获得子进程的pid
2. 用getpid可以获得当前进程的pid
3. 用system()执行shell命令 ps -ax | grep "程序名"|awk '{print $1}'
2. 用getpid可以获得当前进程的pid
3. 用system()执行shell命令 ps -ax | grep "程序名"|awk '{print $1}'
|
#include
system("脚本绝对路径名")
或者用exec()也行。
system("脚本绝对路径名")
或者用exec()也行。