[완료] 소켓의 소유권 상속 금지 방법?

철이^^v의 이미지

안녕하세요.

어떤 프로세스에서 서버 소켓을 만들고 난뒤 자식 프로세스를 만들었습니다.
그리고 부모 프로세스만 먼저 실행을 종료한 경우에, 살아있는 자식 프로세스가 서버 소켓에 대한 소유권을 가지게 되던데요,
이를 금지할수 있는 방법이 없을까요?

#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <fcntl.h>
 
int create_dummy_socket(int port)
{
    int status, sockfd;
    struct sockaddr_in servaddr;
    int iOptVal;
 
    if ((sockfd = socket(PF_INET, SOCK_DGRAM, 0)) < 0)
    {
        return -1;
    }
 
    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family      = AF_INET;
    servaddr.sin_port        = htons(port);
    servaddr.sin_addr.s_addr = INADDR_ANY;
 
    if ((status = bind(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr))) != 0)
    {
        perror("socket binding error! ");
        return -1;
    }
}
 
 
int main(int argc, char *argv[])
{
    if (create_dummy_socket(8888) < 0)
    {
        exit(0);
    }
 
    system("sh");
}

이 프로그램을 컴파일해서 수행시킨후에 "netstat -lnp | grep :8888" 을 해보면, 처음에는 부모 프로세스가 해당 소켓을 open 한것으로 나옵니다.
그 뒤에 해당 부모 프로세스만 죽여버리고 다시 "netstat" 으로 확인해 보면, 자식 프로세스인 "sh" 가 해당 소켓의 권한을
상속하고 있습니다. 자식 프로세스까지 죽여야 해당 소켓이 release 되는데요, 부모 프로세스가 죽을때 소켓도 같이 release 되게 할수 있는 방법이 없을까요?

ganadist의 이미지

http://udrepper.livejournal.com/20407.html

그런데 2.6.27부터 된다는군요.

전통적으로는 새로 fork하고 나서 0, 1, 2를 제외한 모든 fd를 걍 닫아버리도록하는 방법을 많이씁니다.

----
데스크탑 프로그래머를 꿈꾸는 임베디드 삽질러

----
데스크탑 프로그래머를 꿈꾸는 임베디드 삽질러

bacon의 이미지

fork()하고 execxxx() 하기전에 불필요한 파일디스크립터들은 닫아(close) 주세요.

철이^^v의 이미지

ganadist 님이 알려주신 방법은 커널 버젼관계로 좀 힘들것 같네요... (2.6.18 이라 ^^;)

자신이 생성한 모든 서버소켓을 다 닫으려면 그 목록을 알아야 할것 같은데요.
(관리 안한 잘못이 있긴 하지만 -.-a)
혹시, 현재 open 된 디스크립터 목록이라던지 최대값을 다른 방법으로 얻어오는 방법이 있나요?

아니면, 그냥 3번부터 파일 디스크립터 최대값까지 for loop 를 돌면서 close() 를 호출하나요?
멋진 방법을 알고 계시다면 부탁드립니다.

ganadist의 이미지

sysconf 이나 getrlimit로 최대값을 얻을 수 있습니다.

----
데스크탑 프로그래머를 꿈꾸는 임베디드 삽질러

----
데스크탑 프로그래머를 꿈꾸는 임베디드 삽질러

철이^^v의 이미지

덕분에 좋은 함수들 몇가지를 새로 배우게 되었네요.

막연히 '/proc//fd 를 뒤지면 되는건가?' 라고 생각중이였는데 말이죠.

답변 주신 여러분들 모두 감사드립니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.