FreeBSDで遊ぶ
(ハードとソフトのページ)

powered
HOME
Ethnaのインストール
Pearのインストール
PHP-4.3.10+GD
  インストール

FreeBSD-5.3 SMP
  (Dual-CPU)化
FreeBSD-4.0 SMP
  (Dual-CPU)化
Timerプログラミング
危険なうさぎと遊ぶ
タイムサーバで遊ぶ
Vine2.6 Linux
リンク集

危険なうさぎと遊ぶ FreeBSD

1)K&R-Cでプログラミング
  昔遊んだ、うさぎちゃんプログラム。名前はかわいいが、危険なプログラミング “Rabbit.c” 自己増殖するプログラミングを思い出し、コンバージョン。 現段階ではOS-9よりコンバージョンのためシグナル・ハンドリング・ルーティーンが、 FreeBSDに対応していません。近いうちに対応します。

※参考文献 RAINBOW OS-9ガイド( 悪名高いうさぎプログラム[rabbit.asm],クッキーモンスター[Cookie.asm] )Cookie.cも書いたのは記憶にあるんですがHDDを探してるんですけど見つかれば、掲載したいと思います。  シグナルの仕組みがわかるかも??

ラビット増殖プログラム(テキストファイル)

/********************************************************************************/
/*                                                                              */
/*    著作権は放棄しません、自由に使用・改造・再配布可能です。                  */
/*    改造版を再配布する際は、必ずファイル名を変更して、オリジナルを添付して    */
/*    配布してください。                                                        */
/*                                                                              */
/*          プログラム名 : ラビット増殖プログラム                               */
/*          ファイル名   : rabbit.c                                             */
/*          概要         : 全てのシグナルを無視しシステムのリソースメモリー     */
/*                         空間を食いつぶす ちょっと 危険なプログラムです。     */
/*          作成者       : S.Hata                                               */
/*                                                                              */
/*          適応装置     : OS-9 FreeBSD & Linuxサーバ                           */
/*                                                                              */
/*          変更履歴     : Make  1991/09/11                                     */
/*          Ver  Date                履歴(History)                氏名(Name)    */
/*         ---- --------   --------------------------------   ----------------- */
/*          0.1 91/12/20    新規作成                              S.Hata        */
/*          0.2 00/12/14    OS-9 to FreeBSD4.0 Converto           S.Hata        */
/*          0.3 01/01/23    シグナル・ハンドリング追加            S.Hata        */
/*          0.4 03/08/28    シグナル・ハンドリング訂正(FreeBSD4.7)S.Hata        */
/*          0.5 06/04/04    gcc ver 2.95.4			  S.Hata	*/
/*                                                                              */
/********************************************************************************/
/*  06/04/04 */

#include	<time.h>
#include	<sys/signal.h>
#include	<stdio.h>

#define ERROR   (-1)


int sigcode = 0;

    void handler(int sv_mask)  /* シグナル・ハンドリング  */sv_mask  ← ここがsignal.hで変わっていました。
{
    sigcode =sv_mask;    /* short cooding ? */sv_mask  ← ここがsignal.hで変わっていました。
}

main(argc, argv)
int  argc;
char *argv[];
{
   char  buffer[1024*1024];

   signal(sigcode,handler); /* シグナルインターセプト ルーティンを設定 */

    if ( argc == 1 || ( argv[1][0]== '-' &&  argv[1][1] == '?' )){
        usage();
        _exit(0);
    }
    if ( argv[1][0] == '-' && ( argv[1][1] == 'a' || argv[1][1] =='A' )){
        fprintf(stdout,"\07\nAh ... あなたの好奇心がとんでもないことを ........ \n");
        fprintf(stdout,"\07\nあなたは「 パンドラ 」の箱を開けてしまった !!\n\n");
        sleep(2);
        strcpy( buffer,"I need memory !!"); 
        for (;;){
            while (!sigcode){
                printf("%s\n", buffer);
                system("rabbit -a&");
                sleep(1);  /*  sleeping 1000m sec  */
            }
            printf("This signal isn't accepted. <%d>\n",sigcode);
            sigcode = 0;
        }
    }
}
usage()
{
    printf("\07\nこのプログラムは非常に危険なプログラムです\n");
    printf("決して起動しないよう。 !!\n");
    printf("どうしても起動したい ..... !!  衝動にかられたら\n");
    printf("誰もシステムを使用していない事を確認してから .... ");
    printf("リセットを覚悟で起動して下さい。 \n\07\n");
    printf("\nrabbit : please give me parameter.\n");
    printf("Syntax   : rabbit [opt]\n");
    printf("Option   : -a auto mode\n");
    printf("    -?   : you know this one\n");
}
/*   rabbit.c end of program    */
/*
This program is a very dangerous program.
To start never.
Anyone is ... after it confirms that a system isn't being used.
Start resetting by the resolution. 
*/

さっそく遊んでみましょう。
cc -o rabbit rabbit.cでコンパイルが通ればOKです。
オブジェクトをcp rabbit /usr/local/bin/rabbit にコピーして、rabbit -a &
但し、誰も使っていないマシンで実行してね。
でないと、皆からのブーイングですよ!
システム復旧はreboot,とハードリセットのみですから。

TestマシンP-II-350MHz RAM-64MB、fork: Resource temporarily unavailables で確認。
rabbit-aプロセスがメモリを使いきりプロセスが 1,275 位で止まってしまいました。
#define BUFSIZES 5120 のサイズを変えてテストしてみるとまた変わってくると思います。
プログラムを作る上で(メモリとプロセス数の比較)一つの目安になると思います。


注意 : このプログラムは個人の責任において御試用して下さい。
私は一切の責任をとらないものとします。