daemon 프로세스는 현재 working directory를 / 로 잡아 만약 상대경로로 동적라이브러리를 불러온다면 정확한 위치를 잡아내지 못하는 단점이 있습니다.
이를 해결하려면 어떻게 해야할까요?
당연히 동적 라이브러리위 위치를 절대경로로 잡으면 되지만, 여러가지 이유로 그렇게 하기 어려울 때가 있습니다. /lib 나 /usr/lib 등에 두면 아마 자동으로 라이브러리를 링크할 것 같지만, 상황상 그렇게 하지 못하는 경우도 있기 때문입니다.
이번 포스팅에서는 그 해결책을 C언어를 기준으로 설명해보도록 하겠습니다.
우선 프로세스를 daemon으로 만들기 전에 해 주어야 한다는 것이 전제로 붙습니다.
#include <unistd.h>
#include <libgen.h>
#include <stdio.h>
#include <limits.h>
char lib_path[PATH_MAX];
int getLibDir()
{
char exe_path[PATH_MAX];
ssize_t len = readlink("/proc/self/exe", exe_path, sizeof(exe_path) - 1);
if(len != -1)
{
exe_path[len] = '\0';
char* dir = dirname(exe_path);
// 여기에 원하는 대로 라이브러리의 위치를 지정합니다.
sprintf(lib_path, "%s/../lib/", dir);
return 0;
}
else
{
return -1;
}
}
readlink()를 통해 실제로 작동하고 있는 프로세스의 경로를 잡아줍니다.
그 다음, sprintf()로 경로 뒤에 원하는 대로 상대 경로를 지정해줄 수 있습니다. 이렇게 한다면 손쉽게 경로를 지정할 수 있습니다.lib_path 변수에 값을 저장해 둔 뒤, 필요할 때마다 써먹을 수 있습니다.
단, 반드시 daemon 프로세스화 하기 전에 이 코드가 먼저 실행되어야 합니다. 그렇지 않으면 어차피 readlink()를 해봤자 /만 나오겠죠?
여기까지 데몬 프로세스에서 원하는 위치에 상대경로 라이브러리를 만드는 방법에 대해 알아보았습니다.
질문이나 잘못된 부분이 있다면 댓글로 알려주시면 감사하겠습니다.
| [리눅스 시스템] rm -r, rm -ri, rm -rf가 뭐지? (0) | 2026.04.30 |
|---|
댓글 영역