linux - 得到进程的pid

时间:2011-03-08 12:56:55

标签: c++ linux pid

如何在不使用系统调用的情况下在Linux上使用C ++获取名为abc的服务的PID?我很感激你提供的任何例子。

2 个答案:

答案 0 :(得分:3)

由于现在不鼓励使用sysctl,建议的方法是检查/proc中的每个进程条目并阅读每个文件夹中的comm文件。例如,如果您的示例中该文件的内容为abc\n,那就是您正在寻找的过程。

我真的不会说C ++,但这是POSIX C89中可能的解决方案:

#include <glob.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>

pid_t find_pid(const char *process_name)
{
    pid_t pid = -1;
    glob_t pglob;
    char *procname, *readbuf;
    int buflen = strlen(process_name) + 2;
    unsigned i;

    /* Get a list of all comm files. man 5 proc */
    if (glob("/proc/*/comm", 0, NULL, &pglob) != 0)
        return pid;

    /* The comm files include trailing newlines, so... */
    procname = malloc(buflen);
    strcpy(procname, process_name);
    procname[buflen - 2] = '\n';
    procname[buflen - 1] = 0;

    /* readbuff will hold the contents of the comm files. */
    readbuf = malloc(buflen);

    for (i = 0; i < pglob.gl_pathc; ++i) {
        FILE *comm;
        char *ret;

        /* Read the contents of the file. */
        if ((comm = fopen(pglob.gl_pathv[i], "r")) == NULL)
            continue;
        ret = fgets(readbuf, buflen, comm);
        fclose(comm);
        if (ret == NULL)
            continue;

        /*
        If comm matches our process name, extract the process ID from the
        path, convert it to a pid_t, and return it.
        */
        if (strcmp(readbuf, procname) == 0) {
            pid = (pid_t)atoi(pglob.gl_pathv[i] + strlen("/proc/"));
            break;
        }
    }

    /* Clean up. */
    free(procname);
    free(readbuf);
    globfree(&pglob);

    return pid;
}

警告:如果有多个正在运行的进程具有您要查找的名称,则此代码将仅返回一个。如果您要更改它,请注意,如果编写了天真的glob,您还将检查/proc/self/comm,这可能会导致重复输入。

如果有多个具有相同名称的进程,则确实没有办法确保您获得正确的进程。由于这个原因,许多守护进程能够将其pid保存到文件中;检查你的文件。

答案 1 :(得分:1)

Google已涵盖此内容:)

http://programming-in-linux.blogspot.com/2008/03/get-process-id-by-name-in-c.html

虽然它确实使用了sysctl,这是一个系统调用!

它是C但在C ++中应该也能正常工作