반응형
Notice
Recent Posts
Recent Comments
관리 메뉴

꿈꾸는 사람.

PID로 process name 얻기. 본문

IT/Linux

PID로 process name 얻기.

현무랑 니니 2014. 7. 15. 03:27
반응형











리눅스는 PID (process id)로  process name을 찾는 API를 제공하지 않는다.

실행 중인 프로세스의 이름을 알 수 있는 명령어는 다음 명령으로 확인할 수 있다.

1. pid로 process name 찾는 명령.

$ ps -p 10 -o comm=
rcu_sched
$ ps -p 1 -o comm=
init

PID로 process name만 출력하는 명령이다.


$ ps -p 10 -o comm=
$ cat /proc/1/cmdline
/sbin/init
$ cat /proc/10/cmdline
$ 

/proc 파일 시스템을 이용하여 프로세스 이름을 찾을 수 있다.


2.   pid로 process name 찾는 getpname.c 프로그램

프로그램에서 프로세스 이름을 찾는 방법은 /proc/$PID/cmdline을 이용하면 된다.

  • 프로세스 이름을 찾는 getProcessNameByPid() 함수
int getProcessNameByPid(int pid, char* name)
{
    int result = ESUCCESS;

    sprintf(name, "/proc/%d/cmdline", pid);
    FILE* fp = fopen(name,"r");
    if(!fp){
        result = ENOPROC;
    }
    else {
        size_t size;
        size = fread(name, sizeof(char), MAX_PROCESS_NAME , fp);
        if(size>0){
            name[size] ='\0';
        }
        else {
            result = ENONAME;
        }
        
        fclose(fp);
    }

    return result ;
}


getProcessNameByPid()를 사용하는 main() 함수

#include 
#include 

#define MAX_PROCESS_NAME 512
#define ESUCCESS	0
#define ENOPROC		1
#define ENONAME		2

int getProcessNameByPid(int pid, char* name);

int getProcessNameByPid(int pid, char* name)
{
...
}

int main(int argc, char **argv)
{
    int iPid = 0;
    int ret = 0;
    char* pName = (char *) calloc(MAX_PROCESS_NAME, sizeof(char));

    if (argc < 1) {
        printf("Usage: getpname [pid]\n");

        return 0;
    }

    if (pName) {
        iPid = atoi(argv[1]);
    }
    else {
        printf("Can't alloc the buffer of process name.\n");
        return 0;
    }

    ret = getProcessNameByPid(iPid, pName);
    switch (ret) {
        case ESUCCESS:
            printf("The process name of %d is %s.\n", iPid, pName);
            break;

        case ENOPROC:
            printf("The process with %d isn't found.\n", iPid);
            break;

        case ENONAME:
            printf("Can't read cmdline of %d.\n", iPid);
            break;

        default:
            printf("Unknown error.\n");
            break;
    }

    return 0;
}


3. pid로 process name 찾는 getpname.c 컴파일

$ gcc getpname.c -o getp
getpname.c: In function ‘main’:
getpname.c:42:28: warning: incompatible implicit declaration of built-in function ‘calloc’ [enabled by default]

데이터 타입이 맞지 않아 경고가 표시된다.

잡고 가야 하지만 실행에 문제 없다.

실행 파일은 getp로 한다.


4. pid로 process name 찾는 getp 실행 예.

$ ./getp 1
The process name of 1 is /sbin/init.
$ ./getp 10
Can't read cmdline of 10.
$ ./getp 100
The process with 100 isn't found.

1 번 프로세스는 init 프로세스이다.

10번 프로세스는 cmdline에 프로세스 이름이 없다. 이런 경우는 이 프로그램은 쓸모가 없다.

100번 프로세스는 존재하지 않는 것이다.


getname.c는 user space에서 동작하는 프로그램으로 kernel space에서는 사용할 수 없다.

반응형
Comments