close-on-exec ??

QnA 2009. 7. 6. 01:22

보통 프로세스에서 exec(3) 를 시켜서 새로운 프로세스를 실행시키면
이 새로운 프로세스는 기존의 프로세스의 이미지를 덮어쓰게 된다.
그러면서 특별한 설정이 없을경우 열린파일지정자를 그대로 넘겨주게 된다.
exec 하면서 열린파일지정자가 상속되었음을 알수 있다.
그러나 때때로 exec 를 이용해서 프로세스를 만들기전에 기존에 열렸던
파일지정자들을 깨끗하게 정리하고 싶을때가 있을것이다.
이러한 경우를 close-on-exec 시킨다라고 말한다.
어떻게 하냐? fcntl함수를 이용해서 열린 파일지정자에 대해서 close-on-exec 작동을
하도록 할수 있다.
close-on-exec 값을 조정하기 위해서 사용된다. F_GETFD 를 이용해서 FD_CLOEXEC 값을 가져오고
F_SETFD 를 이용해서 이 값을 변경한다. 기본적으로는 exec 할때 close 되지 않는다.

예제 : open-on-exec.c #include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

int main()
{
    int fd;
    int val;
    fd = open("exec_copy.txt", O_CREAT);

    execl("/home/my_cvs/test/c_source/loop", "./loop", 0);
}
   
 
execl 로 실행시키는 loop 프로그램은 그냥 무한루프 도는 프로그램 이니 각자 만들기 바란다.

위 프로그램을 실행시킨후 ps 를 확인하고 /proc/pid/fd 로 이동해서 ls 를 해보면
[root@coco fd]# ls -al
합계 0
dr-x------    2 root     root            0 10월 25 13:59 .
dr-xr-xr-x    3 root     root            0 10월 25 13:59 ..
lrwx------    1 root     root           64 10월 25 13:59 0 -> /dev/ttyp0
lrwx------    1 root     root           64 10월 25 13:59 1 -> /dev/ttyp0
lrwx------    1 root     root           64 10월 25 13:59 2 -> /dev/ttyp0
lr-x------    1 root     root           64 10월 25 13:59 3 -> /home/mycvs/test/exec_copy.txt
exec 하면서 열린파일지정자가 상속되었음을 알수 있다.


[출처] close-on-exec|작성자 withjesus78



WRITTEN BY
RootFriend
개인적으로... 나쁜 기억력에 도움되라고 만들게되었습니다.

,