programing

왜 C-포크 폭탄은 Bash 폭탄처럼 작동하지 않는 거죠?

sourcejob 2022. 7. 21. 23:37
반응형

왜 C-포크 폭탄은 Bash 폭탄처럼 작동하지 않는 거죠?

고전적인 배쉬 포크밤을 작동시키면:

:(){ :&:&};:

시스템이 몇 초 후에 행업합니다.

C로 포크밤을 쓰려고 했는데, 코드는 다음과 같습니다.

#include <unistd.h>

int main( )
{
    while(1) {
        fork();
    }
    return 0;
}

실행 시 시스템의 응답성이 떨어집니다만, 이 프로세스를 종료할 수 있습니다(몇 분 후라도).^C.


위의 코드는 제가 올린 원래 bash 포크밤과는 다릅니다.이것은 다음과 같습니다.

:( )
{
    while true
    do
        :
    done
}

(테스트를 하지 않았습니다.시스템이 정지할지는 모르겠습니다).

그래서 원래 버전도 구현하려고 했습니다.여기 코드는 다음과 같습니다.

#include <unistd.h>

inline void colon( const char *path )
{
    pid_t pid = fork( );
    if( pid == 0 ) {
        execl( path, path, 0 );
    }
}

int main( int argc, char **argv )
{
    colon( argv[0] );
    colon( argv[0] );
    return 0;
}

하지만 아직 아무것도 없다.실행해서 쉽게 죽일 수 있어요.그건 내 체질에 안맞아.


왜요?

배쉬 포크봄이 뭐가 그렇게 특별해?bash가 메모리/CPU를 훨씬 더 많이 사용하기 때문입니까? bash 프로세스가 나보다 더 많은 시스템 호출(파일 시스템에 액세스하기 위해 등)을 호출하기 때문입니까?

문제의 진짜 원인은 BASH에서 작성한 프로세스가 부모로부터 분리되기 때문입니다.부모 프로세스(처음 시작한 프로세스)가 중지된 경우 나머지 프로세스는 그대로 유지됩니다.그러나 C의 실장에서는 부모가 사망하면 자녀 프로세스가 정지하기 때문에 포킹 프로세스의 트리 전체를 다운시키기 위해 시작한 초기 프로세스를 다운시키기에 충분합니다.

부모가 사망해도 자녀들이 죽지 않도록 자녀 과정을 분리하는 C 포크폭탄은 아직 생각해내지 못했습니다.이러한 구현에 대한 링크를 주시면 감사하겠습니다.

그 C 프로그램은 아주 작아요, 정말 작아요게다가 fork()와 같은 프로그램을 실행하는 것은 매우 효율적입니다.그러나 Bash와 같은 인터프리터는 RAM 사용률 면에서 훨씬 더 비싸고 디스크에 항상 액세스해야 합니다.

더 오래 실행해 보세요.:)

bash forkbom에서는 새로운 백그라운드프로세스 그룹에 새로운 프로세스를 배치하기 때문에^C그들.

그것은 기본적으로 크기 때문이다.bash fork bomb을 실행하면 bash fork bomb은 메모리에 큰 몬스터 프로그램을 로드합니다(c프로그램에 대한). 각 프로그램은 CPU 리소스에 의존하기 시작합니다.확실히 큰 괴물들이 문제를 일으키기 시작하면 벌들이 문제를 일으키기 시작할 때보다 더 빨리 온다.그래서 컴퓨터가 즉시 행업합니다.다만, c 실행 파일을 장시간 실행한 채로 두면, 시스템도 행업합니다.단지 시간이 훨씬 더 걸릴 것이다.bash의 크기와 c 프로그램의 크기를 비교하려면 /proc//status를 확인하십시오.먼저 실행 중인 bash 인스턴스의 pid를 사용하고 다음으로 c 프로그램의 실행 중인 인스턴스의 pid를 사용합니다.

언급URL : https://stackoverflow.com/questions/4244016/why-c-forkbombs-dont-work-like-bash-ones

반응형