�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
from 1998/3/4