자신의 process 이름 얻어오는 함수 좀 ^^

ninakhlee의 이미지

FreeBSD4.4 사용하고 있는데요.

현재 실행되어 있는 자신의 process의 이름을 구하고 싶은데..
잘 안되네요..

솔라리스같은 경우에는 아래와 같이 할 수 있잖아요.
근데 FreeBSD에서 저렇게 하려고 하면 우선 psinfo_t부터 없다고 나오네요.

FreeBSD는 프로세스 정보 얻어오는 구조체가 다른가요?
알려주세요.. ^^

struct psinfo_t      pinfo;
sprintf (procdir, "/proc/%d/status", getpid());
fd = open (procdir, O_RDONLY);
read(fd, (void *)&pinfo, sizeof(pinfo));
printf ("process name is %s\n", pinfo.pr_fname);
superkkt의 이미지

좀 다른 방법이지만 그냥 argv[0]을 사용하면 간단하지 않은가요?

======================
BLOG : http://superkkt.com

======================
BLOG : http://superkkt.com

purewell의 이미지

getpid()로 pid 얻어서 /proc를 뒤지는 것도 한 방법 아닐까요?
_____________________________
언제나 맑고픈 샘이가...
http://yubink.com - 강아지 필요하세요?
http://purewell.biz - 헙!!

_____________________________
언제나 맑고픈 샘이가...
http://purewell.biz

sangwoo의 이미지

이럴때 top(3)의 소스를 보면 좋겠죠 :-)
FreeBSD 6.X에서는 kvm_getprocs() 로부터 얻어지는 kinfo_proc 스트럭쳐의 ki_comm 멤버 변수가 아마 command name일 겁니다. 매뉴얼 페이지를 보세요!
FreeBSD는 대부분 /proc을 사용하지 않는답니다~ :-) 보안이나 기타 등등 때문에..

----
Let's shut up and code.

----
Let's shut up and code.

sangwoo의 이미지

FreeBSD 6.0 에서 테스트했습니다. command name을 printf로 출력하는 예입니다.

#include <sys/param.h>
#include <sys/types.h>
#include <sys/sysctl.h>
#include <sys/user.h>
 
#include <err.h>
#include <fcntl.h>
#include <kvm.h>
#include <stdio.h>
#include <unistd.h>
 
int
main(int argc, char *argv[])
{
        int pcnt;
        kvm_t *kd;
        pid_t pid;
        struct kinfo_proc *p;
 
        kd = kvm_open(NULL, "/dev/null", NULL, O_RDONLY, "kvm_open");
        if (kd == NULL)
                err(1, "Couldn't open kvm");
        pid = getpid();
        p = kvm_getprocs(kd, KERN_PROC_PID, pid, &pcnt);
        if (p == NULL)
                err(1, "Couldn't get proc info via kvm");
        printf("%s\n", p->ki_comm);
        return (0);
}

----
Let's shut up and code.

----
Let's shut up and code.