�R���s���[�^�[�FC����u���F�}���`�X���b�h�ɂ‚���


�}���`�X���b�h�̓���

�@��ʓI�ȃT�[�o�v���O�����ł́A�����̃N���C�A���g����̏������ł��邾�����A���^�C���ɏ������邽�߂ɁA���炩�̌`�ŕ��񏈗����s�����Ƃ��������̂ł��B���Ƃ��΁A�f�[�^�x�[�X�T�[�o�ŁA���錟�������Ɏ��Ԃ��������Ă���Ԃق��̃N���C�A���g���ڑ�����ł��Ȃ��A�Ƃ�����Ԃł̓T�[�o�Ƃ��Ď��i�ł��傤�B

�@���񏈗�������������@�Ƃ��ẮA

�E�v���O�������̂���񏈗��”\�ɋL�q����
�E�v���Z�X�����Ƃ��Ƒ����N�����Ă���
�Efork()���g���Ďq�v���Z�X���N������}���`�v���Z�X����
�E�}���`�X���b�h���g�p����

�Ȃǂ��l�����܂��B�v���O�������̂����A���^�C�������l�����Ȃ���L�q����̂͂Ȃ��Ȃ���ςŁA�������\�[�X�����G�ɂȂ胁���e�i���X������肪�����Ȃ肪���ł��B�v���Z�X�����Ƃ��Ƒ����N������̂͊ȒP�ł����A�N���C�A���g���ǂ̃v���Z�X�Ɉ˗����邩�𔻒f���邩�A���邢�͂����ɐU�蕪����T�[�o���K�v�ɂȂ�ł��傤�B�Œ�I�ȏ����ɂ͌����Ă��܂��Bfork()���g���Ďq�v���Z�X�N������̂�UNIX�ł͔��ɓ`���I�ȕ��@�ŁA�N���C�A���g����̐ڑ����󂯕t���A���ꂩ��q�v���Z�X�ɕ��򂷂邱�Ƃ��”\�ŁA�v���Z�X��Ԃ����ꂼ��Ɨ����Ă��܂�����A�v���O���~���O����r�I�y�ł����A��肪�������Ă��T�[�o�{�̂����ʂ܂ł̎��͖̂h���邱�Ƃ������A���S�����������@�ł��B�}���`�X���b�h�͔�r�I�ŋߏo�Ă������@�ŁA�P�v���Z�X���ŕ��񏈗��������ł��܂��B

�@fork()�ɂ��}���`�v���Z�X�ƃ}���`�X���b�h���ėp�I�ȃT�[�o�\�z�̎�@�Ƃ��ėǂ������ł����A���̓�‚̈Ⴂ�����Ă݂܂��傤�B

�E�}���`�v���Z�X

���v���Z�X��Ԃ��Ɨ����Ă���̂ŁA�O���[�o���ϐ���A�X�^�e�B�b�N�ϐ���S�z�Ȃ��g�p�ł���B
���•ʂɃf�o�b�O���e�ՁB
���P�v���Z�X�ɑ΂��鐧���i�����I�[�v���t�@�C�����Ȃǁj���C�ɂ����A�����̏������”\�B
���q�v���Z�X���E�����肵�Ă��S�̂ɉe�����o�ɂ����B
���q�v���Z�X�����ő��ʂ̃��������m�ۂ��Ă��A���̃v���Z�X���I������ΊJ������A�T�[�o�{�̂̃T�C�Y���傫���Ȃ�ɂ����B
�~�v���Z�X��Ԃ������K�v�ɂȂ�̂ŁA����������ʂ������Ȃ肪���B
�~�v���Z�X�T�C�Y���傫���ꍇ�Afork()���̂Ɏ��Ԃ�������B
�~UNIX�ȊO��OS�ŃT�|�[�g����Ă��Ȃ��ꍇ�������B
�~�r������E��������Ȃǂ��A�v���Z�X�ԒʐM�Ȃǂ��g����Ԃ�������B
�~�q�v���Z�X�I�����ɐe�v���Z�X��wait()�ȂǂŏI���X�e�[�^�X�𓾂Ȃ��ƃ]���r�v���Z�X���c��B

�E�}���`�X���b�h

���P�v���Z�X��Ԃ����ŕ��񏈗�����̂Ń������𖳑ʂɏ���Ȃ��B
���X���b�h�������̂͂قƂ�ǎ��Ԃ�������Ȃ��B
��UNIX�ȊO��OS�ł��T�|�[�g����Ă���ꍇ�������B
���X���b�h�̏I���X�e�[�^�X�͓��ɑ҂•K�v�͂Ȃ��B
���r�������Ȃǂ��񋟂���Ă���
�~�P�v���Z�X��ԓ��ł̕��񏈗��Ȃ̂ŁA�O���[�o���ϐ���X�^�e�B�b�N�ϐ��͊댯�B
�~�f�o�b�O���s���ɂ����B
�~�P�v���Z�X�ɑ΂��鐧���i�����I�[�v���t�@�C�����Ȃǁj�ɂ��A�����������肳���B
�~�X���b�h�̓r���I��������B
�~�X���b�h���œ��I�ɑ��ʂ̃��������m�ۂ���ƁA�v���Z�X�T�C�Y���傫���Ȃ�A�߂�Ȃ�

�@���̂悤�Ȋ����ł��傤���B�����g�A���NUNIX�ł̃T�[�o�v���O���~���O�ɂ�fork()�ɂ��}���`�v���Z�X���g�������Ă��܂������A�����̒����E�Z���̒��ŁA���ɁAUNIX�ȊO�ŃT�|�[�g����Ă��Ȃ��ꍇ�������A�d�����A�Ƃ����_�Ń}���`�X���b�h���g���悤�ɂȂ��Ă��܂����B���܂��Ɉ��S�ʂł̓}���`�v���Z�X���ƍl���Ă���܂����AUNIX,Windows�Ȃǃ}���`�v���b�g�z�[���ŃA���S���Y�������������߂ɂ����ł��}���`�X���b�h�̉��l�͂���̂ł͂Ȃ��ł��傤���B�������A�y�ʂŁA�p�ɂɎq���������܂ꂽ�莀�񂾂肷��ꍇ�ɂ̓p�t�H�[�}���X�I�ɂ����͓I�ł��B

�@�}���`�X���b�h�Ńv���O���~���O���Ă����΁A���Ƃ���}���`�v���Z�X�ɂ���͔̂�r�I�ȒP�ł��B�}���`�X���b�h�̕����������������߂ł��B�t�Ƀ}���`�v���Z�X�̃\�[�X���}���`�X���b�h�ɕύX����̂͊댯���������ł��B���ɃO���[�o���ϐ��A�X�^�e�B�b�N�ϐ��̈������G�ł��ƁA�g�ݒ������������������m��܂���B

�}���`�v���Z�X�v���O���~���O

�@�}���`�X���b�h�Ƃ̔�r�̂��߂ɁA�܂���fork()�ɂ��}���`�v���Z�X�v���O���~���O�����Ă݂܂��傤�B

----- mp.c -----
#include        <stdio.h>
#include        <sys/types.h>
#include        <sys/wait.h>

void counter()
{
int     i;
pid_t   pid;

        pid=getpid();

        for(i=0;i<10;i++){
		sleep(1);
                printf("[%d]%d\n",pid,i);
        }

	return;
}

void main()
{
pid_t   p_pid,pid;

	p_pid=getpid();

        printf("[%d]start\n",p_pid);

        switch(pid=fork()){
                case    0:      /* child */
                        counter();
                        exit(0);
                case    -1:
                        perror("fork");
                        break;
                default:        /* parent */
                        printf("[%d]child pid = %d\n",p_pid,pid);
                        break;
        }

        switch(pid=fork()){
                case    0:      /* child */
                        counter();
                        exit(0);
                case    -1:
                        perror("fork");
                        break;
                default:        /* parent */
                        printf("[%d]child pid = %d\n",p_pid,pid);
                        break;
        }

        pid=wait(0);
        printf("[%d]pid = %d end\n",p_pid,pid);
        pid=wait(0);
        printf("[%d]pid = %d end\n",p_pid,pid);

        printf("[%d]end\n",p_pid);
}

�R���p�C���E�����N

cc mp.c -o mp

���s����

[7257]start
[7257]child pid = 7258
[7257]child pid = 7259
[7258]0
[7259]0
[7258]1
[7259]1
[7258]2
[7259]2
[7258]3
[7259]3
[7258]4
[7259]4
[7258]5
[7259]5
[7258]6
[7259]6
[7258]7
[7259]7
[7258]8
[7259]8
[7258]9
[7257]pid = 7258 end
[7259]9
[7257]pid = 7259 end
[7257]end

�@���ɃV���v���ȃT���v���ł����A�ȒP�ɐ������܂��ƁAmain()�ł́A�����̃v���Z�XID���͂��߂ɒ��ׁA�Ȍ�printf()�ŏo�͂���ۂɂǂ̃v���Z�X���o�͂����̂����킩��悤�ɂ��Ă��܂��Bfork()�Ŏq�v���Z�X����������܂����A�߂�l��0�̏ꍇ���q�v���Z�X�A-1�̓G���[�A����ȊO�͐e�v���Z�X�ŁA�߂�l�͎q�v���Z�X�̃v���Z�XID�ɂȂ�܂��B�T���v���ł͂Q�Žq�v���Z�X���N�����Ă��܂��B

�@�q�v���Z�X�ł�counter()�֐����R�[�����Ă��܂��B�͂��߂Ɏ����̃v���Z�XID�𒲂ׁA�P�b�Ɉ�x�A0����9�܂Ő��l��\�����邾���̊֐��ł��B�֐����I������ƁAexit()�ŏI�����܂��B

�@�e�v���Z�X��wait()�Ŏq�v���Z�X�̏I����҂��܂��B�T���v���ł͂Q�‹N�������̂��킩���Ă���̂ŁA�P���Ƀu���b�N����wait()�łQ��҂��Ă��܂��B

�@���s���ʂ����Ă��������Ƃ킩��悤�ɁA�J�E���g�͂��ꂼ�ꓯ���ɍs���Ă���A���񏈗����s���Ă���̂��킩��܂��Bps�R�}���h�Ńv���Z�X��Ԃ�����ƁA���L�̂悤�ɂR�‚̃v���Z�X�����‚���܂��B

> ps -efl | grep mp
  F S UID        PID  PPID  C PRI  NI ADDR    SZ WCHAN  STIME TTY          TIME CMD
000 S komata    7257  3790  0  69   0    -   317 wait4  11:22 pts/2    00:00:00 mp
040 S komata    7258  7257  0  69   0    -   317 nanosl 11:22 pts/2    00:00:00 mp
040 S komata    7259  7257  0  69   0    -   317 nanosl 11:22 pts/2    00:00:00 mp

�@fork()�̓����́Afork()�������_�Ńv���Z�X����������A�������炻�̂܂ܕʁX�ɏ������p������_�ł��B���ɐ�������}���`�X���b�h�ł̓X���b�h�J�n�͊֐��R�[���ɂ��`�ɂȂ��Ă��܂��B

�}���`�X���b�h�v���O���~���O

�@�}���`�X���b�h�̃v���O���~���O���̂�fork()�ɂ��}���`�v���Z�X�v���O���~���O���l�A���ɊȒP�ł��B�Ȃ��A�X���b�h�ɂ͂��낢��Ȏ�ނ�����܂����A�����ł͔ėp���̍���POSIX�X���b�h�������܂��B

----- mt.c -----
#include        <stdio.h>
#include        <sys/types.h>
#include        <pthread.h>

void *counter(void *arg)
{
int     i;
pid_t   pid;
pthread_t	thread_id;

        pid=getpid();
	thread_id=pthread_self();

        for(i=0;i<10;i++){
		sleep(1);
                printf("[%d][%d]%d\n",pid,thread_id,i);
        }

	return(arg);
}

void main()
{
pid_t   p_pid;
pthread_t	thread_id1,thread_id2;
int	status;
void 	*result;

	p_pid=getpid();

        printf("[%d]start\n",p_pid);

	status=pthread_create(&thread_id1,NULL,counter,(void *)NULL);
	if(status!=0){
		fprintf(stderr,"pthread_create : %s",strerror(status));
	}
	else{
		printf("[%d]thread_id1=%d\n",p_pid,thread_id1);
	}

	status=pthread_create(&thread_id2,NULL,counter,(void *)NULL);
	if(status!=0){
		fprintf(stderr,"pthread_create : %s",strerror(status));
	}
	else{
		printf("[%d]thread_id2=%d\n",p_pid,thread_id2);
	}

	pthread_join(thread_id1,&result);
	printf("[%d]thread_id1 = %d end\n",p_pid,thread_id1);
	pthread_join(thread_id2,&result);
	printf("[%d]thread_id2 = %d end\n",p_pid,thread_id2);

        printf("[%d]end\n",p_pid);
}

�R���p�C���E�����N

cc mt.c -o mt -lpthread

���s����

[7349]start
[7349]thread_id1=1026
[7349]thread_id2=2051
[7351][1026]0
[7352][2051]0
[7351][1026]1
[7352][2051]1
[7351][1026]2
[7352][2051]2
[7351][1026]3
[7352][2051]3
[7351][1026]4
[7352][2051]4
[7351][1026]5
[7352][2051]5
[7351][1026]6
[7352][2051]6
[7351][1026]7
[7352][2051]7
[7351][1026]8
[7352][2051]8
[7351][1026]9
[7349]thread_id1 = 1026 end
[7352][2051]9
[7349]thread_id2 = 2051 end
[7349]end

�@�}���`�v���Z�X�̃T���v���ƑS�����������ɂ��܂����Bpthread_create()�ŃX���b�h�𐶐����܂��B��R�����Ɋ֐����w�肵�Ă��܂����A���ꂪ�X���b�h�̊J�n�����ɂȂ�܂��Bpthread�ł̓G���[��errno��perror()�ł͓���ꂸ�A�֐��̖߂�l��strerror()�ɓn���Ďg�p���܂��B

�@counter()�̓}���`�X���b�h�Ɠ��l�Ȃ��̂ł����A�v���Z�XID�̂ق��ɁA�X���b�hID���\������悤�ɂ��Ă��܂��B�{���A�}���`�X���b�h�̓v���Z�X�͂P�‚Ȃ̂ŁA�v���Z�XID�͂ǂ̃X���b�h�ł�����ɂȂ�ׂ��ł����ALINUX�ł̓v���Z�XID���ʂɂȂ�Aps�Ō����Ƃ��ɂ������̃v���Z�X������悤�Ɍ����Ă��܂��܂��BSolaris�ł͂P�‚ɂȂ�̂ł��̕ӂ�pthread�����̈Ⴂ�ł��傤�B�X���b�h�֐��ɂ͈�ˆ�����n���܂��B�{���̓A�h���X�n���œ��I�Ɋm�ۂ����̈�̃A�h���X��n�����肵�Ă����Ȃ��̂ł����ALINUX�ł̓X���b�h��������Ɍ���A�s����ȏ�Ԃ�����悤�ŁA�n�����A�h���X�̓��e������Ɍ���Ȃ����Ƃ�����܂����BSolaris�ł͖�肠��܂���ł������B�m�F���Ă���g���悤�ɂ��܂��傤�B�l�n����LINUX�ł����Ȃ��悤�ł��B

�@�X���b�h�̏I����pthread_join()�ő҂‚��Ƃ��ł��܂��B�҂•K�v�������ꍇ�́Apthread_detach()�ŏI����Ԃ�ێ����Ȃ��悤�ɐ錾���Ă����Ȃ��Ɠ����e�[�u���Ɏc��悤�ŁA���鐔�ȏ�X���b�h�������ł��Ȃ��Ȃ�܂��B

�@ps�R�}���h�Ŏ��s���Ɍ���ƁALINUX�ł͉��L�̂悤�ɂS�‚̃v���Z�X������悤�Ɍ����Ă��܂��܂��BSolaris�ł͂P�‚�������܂���B�X���b�h�Ƃ��Ă͑S���łR�‚Ȃ̂ɂS�‚���Ƃ����̂��C���������̂ł����A��‚͂����炭�X���b�h����������ۂɊǗ��I�ȖړI�Ɏg���Ă���̂ł��傤�B����I�ɂ̓X���b�h��������̕s���肳�ȊO�͑S�����ʂ̃}���`�X���b�h�ɂȂ��Ă��܂��̂Ŗ��͂���܂��񂪁B

> ps -efl | grep mt
  F S UID        PID  PPID  C PRI  NI ADDR    SZ WCHAN  STIME TTY          TIME CMD
000 S komata    7349  3790  0  60   0    -  1365 rt_sig 11:40 pts/2    00:00:00 mt
040 S komata    7350  7349  0  60   0    -  1365 do_pol 11:40 pts/2    00:00:00 mt
040 S komata    7351  7350  0  60   0    -  1365 nanosl 11:40 pts/2    00:00:00 mt
040 S komata    7352  7350  0  60   0    -  1365 nanosl 11:40 pts/2    00:00:00 mt

Windows�ł̃}���`�X���b�h�v���O���~���O

�@���������}���`�X���b�h���g�p���AUNIX�ȊO�ł�OK�Ƃ������Ƃł��̂�Windows�ł̗l�q���Љ�܂��傤�B

----- mt-win.c -----
#include        <stdio.h>
#include        <sys/types.h>
#include        <process.h>
#include        <windows.h>

unsigned __stdcall counter(void *arg)
{
int     i;
int	no;
int	pid;

	pid=_getpid();

	no=(int)arg;

        for(i=0;i<10;i++){
		_sleep(1000);
                printf("[%d][%d]%d\n",pid,no,i);
        }

	return(0);
}

void main()
{
int	thread_id1,thread_id2;
unsigned	dummy;
int	p_pid;

	p_pid=_getpid();

        printf("[%d]start\n",p_pid);

	thread_id1=_beginthreadex(NULL,0,counter,(void *)1,0,&dummy);
	if(thread_id1==0){
		fprintf(stderr,"pthread_create : %s",strerror(thread_id1));
	}
	else{
		printf("[%d]thread_id1=%d\n",p_pid,thread_id1);
	}

	thread_id2=_beginthreadex(NULL,0,counter,(void *)2,0,&dummy);
	if(thread_id2==0){
		fprintf(stderr,"pthread_create : %s",strerror(thread_id2));
	}
	else{
		printf("[%d]thread_id2=%d\n",p_pid,thread_id2);
	}

	WaitForSingleObject( (HANDLE)thread_id1, INFINITE );
	printf("[%d]thread_id1 = %d end\n",p_pid,thread_id1);
	WaitForSingleObject( (HANDLE)thread_id1, INFINITE );
	printf("[%d]thread_id2 = %d end\n",p_pid,thread_id2);

	printf("[%d]end\n",p_pid);
}

�@Windows�ł́A_beginthreadex()�ŃX���b�h�𐶐��ł��܂��BVC++�ł́u�v���W�F�N�g�̐ݒ�v�uC/C++�v�̃J�e�S���u�R�[�h�����v�ŁA�g�p���郉�C�u�������}���`�X���b�h�̂��̂Ɏw�肵�Ă����܂��B�v���Z�XID�ƁA�X���b�h�̔ԍ���\�����Ă݂܂����B���s���ʂ͉��L�̂悤�ɂȂ�܂��B

���s����

[3292]start
[3292]thread_id1=44
[3292]thread_id2=40
[3292][1]0
[3292][2]0
[3292][1]1
[3292][2]1
[3292][1]2
[3292][2]2
[3292][1]3
[3292][2]3
[3292][1]4
[3292][2]4
[3292][1]5
[3292][2]5
[3292][1]6
[3292][2]6
[3292][1]7
[3292][2]7
[3292][2]8
[3292][1]8
[3292][2]9
[3292][1]9
[3292]thread_id1 = 44 end
[3292]thread_id2 = 44 end
[3292]end

�@���̂悤�Ƀv���Z�XID�͂ǂ̃X���b�h�ł�����ŁA�����UNIX�Ɠ��l�ł��B

�}���`�X���b�h�ł̒��ӓ_

�@�}���`�X���b�h�̓T���v���̂悤�ɁA�v���O���~���O���͓̂���Ȃ��Ƃ͖����̂ł����A��d�v�Ȓ��ӎ���������܂��B�O���[�o���ϐ��ƃX�^�e�B�b�N�ϐ��ł��B�X���b�h�����������ɏ�������A���ꂼ��̃X���b�h�œ���̃O���[�o���ϐ����A�N�Z�X����Ƃ������Ƃ́A�}���`�v���Z�X�Ƃ͈قȂ�A�{���ɓ����ϐ����A�N�Z�X���邱�ƂɂȂ�܂��B���܂����p����΋��ʂ̃p�����[�^�[���ԂȂɎg�p�ł��ĕ֗��Ȃ̂ł����A�C�y�Ɏg���Ă��܂��ƁA���ɒl���i�[����ۂɃX���b�h�Ԃł̏Փ˂��������܂��B

�@�O���[�o���ϐ���肳��ɐ[���Ȗ�肪�A�e�֐��Ŏ����Ă���X�^�e�B�b�N�ϐ��ł��B���[�J���ϐ��͕ʁX�̃X�^�b�N�Ŋm�ۂ���܂��̂ŁA�Ɨ��ł����A�X�^�e�B�b�N�ϐ��̓v���Z�X�Ƃ��ĂP�‚̗̈�Ɋm�ۂ���܂��̂ŁA��J���̗̈�ɂȂ�܂��B���Ƃ��΁Astrtok()�̓g�[�N���̐؂�o���ɕ֗��Ȋ֐��ł����A���L�̂悤�ȃ\�[�X�Ŏ��ۂɖ�肪�������Ă��܂��܂��B

void *client_thread(void *arg)
{
char	buf[80]="This is a pen.";
char	*ptr;

	for(ptr=strtok(buf," "),ptr!=NULL;ptr=strtok(NULL," ")){
		printf("[%s]\n",ptr);
	}

	return(arg);
}

�@���̊֐���pthread_create()�ŃX���b�h�Ƃ��ĕ���������s�����ƁA1��ڂ�strtok()�ŁAstrtok()���̃X�^�e�B�b�N�̈�ɃR�s�[�������e�A�|�C���^�����̃X���b�h�����strtok()�ŏ㏑������Ă��܂��܂��B�v����ɃX�^�e�B�b�N�ϐ����g�p����֐��͕���X���b�h���ł͎g�p�ł��Ȃ��̂ł��B

�@����ɑΉ����邽�߁A���L�̂悤�ȃX���b�h�Z�[�t�֐����񋟂���Ă��܂��B�������g�p����悤�ɏ��������Ă��ǂ��ł����A���邢�͕ʂ̃A���S���Y���ɕύX���邱�Ƃ��K�v�ȏꍇ������ł��傤�B����X���b�h���ȊO�ł͖�肠��܂���B

�X���b�h�Z�[�t�֐�

int getlogin_r(char *name,size_t namesize);
int readdir_r(DIR *dirp,struct dirent *entry,struct dirent **result);
char *strtok_r(char *s,const char *sep,char **lasts);
char *asctime_r(const struct tm *tm,char *buf);
char *ctime_r(const time_t *clock,char *buf);
struct tm *gmtime_r(const time_t *clock,struct tm *result);
struct tm *localtime_r(const time_t *clock,struct tm *result);
int rand_r(unsigned int *seed);
int getgrgid_r(gid_t gid,struct group *group,char *buffer,size_t bufsize,struct group **result);
int getgrnam_r(const char *name,struct group *group,char *buffer,size_t bufsize,struct group **result);
int getpwuid_r(uid_t uid,struct passwd *pwd,char *buffer,size_t bufsize,struct passwd **result);
int getpwnam_r(const char *name,struct passwd *pwd,char *buffer,size_t bufsize,struct passwd **result);

�@���̑��A����malloc()�ȂǁA���C�u�������ł̃X�^�e�B�b�N�ϐ����g�p���镨������Ăяo���Ŗ��ɂȂ�܂��B���A������libpthread.a���C�u�����������N����ƁA�}���`�X���b�h�Ή��̃��C�u�����֐����g�p�����悤�ɂȂ�A���͔������Ȃ��悤�ɂȂ��Ă��܂��B��̓I�ɂ�malloc()�ȂǂŎg�p����q�[�v�̈�̏��Ȃǂ�ی삷�邽�߁Amalloc()�Ȃǂ̊֐��J�n���Ƀ��b�N�@�\��mutex���g���A���b�N���A�֐��I�����ɃA�����b�N���A�������ɂ͓����ɑ���malloc()���������s��Ȃ��悤�ɔr�����䂪����Ă��܂��B���̂悤�ɁA����֐����Ŕr�����䂷��Ηǂ����̂̓��C�u�������őΉ����Ă��܂����A��L���֐��̗p�ɁA�֐����X�^�e�B�b�N�̈��ێ����邱�Ƃ�O��ɐ݌v���ꂽ�֐��͑�֊֐����K�v�ɂȂ�܂��B�����̖�肪����̂ŁA�}���`�v���Z�X��O��ɍ쐬�����\�[�X���}���`�X���b�h�ɕύX����̂͊댯�Ȃ̂ł��B�����ō쐬�����֐����ǂ����ӂ��܂��傤�B


��낵������u���O��������������
�S���t���K��Љ�T�C�g�F�S���t���K��s�r�^�X�V���I
ipv400037761 from 1998/3/4