일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 손민한
- 디자인 패턴
- Tizen
- mysql
- Linux
- 태그를 입력해 주세요.
- ubuntu
- 단통법
- 해외직구
- arm
- 데이터베이스
- 조세피난처
- NC다이노스
- 국정원
- 김경문
- 블로그
- 우분투
- 애플
- 타이젠
- 문파문파
- NC 다이노스
- 야구
- python
- 안드로이드
- 문파문파 공략
- 뉴스타파
- 리뷰
- 인공지능
- 프로야구
- ubuntu 12.04
Archives
- Today
- Total
꿈꾸는 사람.
PID로 process name 얻기. 본문
반응형
리눅스는 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에서는 사용할 수 없다.
반응형
'IT > Linux' 카테고리의 다른 글
[tomcat] tomcat7, tomcat7-admin 설치 (0) | 2014.07.30 |
---|---|
[JAVA] ubuntu 12.04에서 jdk1.8.0_11 설치, 삭제. (0) | 2014.07.30 |
[우분투] 루트 패스워드 초기화. (8) | 2014.02.11 |
[Ubuntu] System settings 재 설치. (0) | 2014.01.28 |
[ARM] stext label, start_kernel() 호출. (0) | 2014.01.25 |
Comments