�ץ������ϡ�¾�Υץ������䥫���ͥ����ߤ��̿����뤳�Ȥǡ�����κ�Ȥ�Ĵ�� ��ޤäƤ��롣Linux �Ǥϡ������Ĥ��Υץ��������̿�(Inter-Process Communication, IPC)�Υᥫ�˥��ब���ݡ��Ȥ���Ƥ��롣�����ʥ�ȥѥ��פ� ����ŵ���Ǥ��뤬��Linux �� System V IPC �ᥫ�˥���⥵�ݡ��Ȥ��Ƥ��롣System V IPC �Ȥ���̾�Τϡ�Unix �����������ǽ����о줷�����Ȥ��餽��̾���դ���� �Ƥ��롣
�����ʥ�ϡ�Unix �����ƥ�ǻ��Ѥ����Ǥ�Ť��ץ��������̿�����ˡ�Ǥ��롣 �����ʥ�ϡ��ҤȤİʾ�Υץ��������Ф�����Ʊ�����٥��(asynchronous events)�� ��ã���뤿��˻��Ѥ���롣�����ʥ뤬���������Τϡ������ܡ��ɳ����ߤ����� ���ꡢ�ץ����������ۥ������¸�ߤ��ʤ����˥����������褦�Ȥ��ƥ��顼���� �����Ȥ��ʤɤǤ��롣�����ʥ�ϡ������뤬�ҥץ��������Ф��ƥ��������ο���� ��ã����Ȥ��ˤ����Ѥ���롣
��Ϣ������Ѥߥ����ʥ뤬���ꡢ�����ϥ����ͥ�ˤ�ä���������뤬��������
���¤�Ϳ�����Ƥ���ʤ顢�����ƥ��Υ����ͥ�ʳ��Υץ������Ǥ���������ǽ��
���롣kill
���ޥ�� (kill -l
) ����Ѥ���С������ƥ���
���Ѳ�ǽ�ʥ����ʥ�Υꥹ�Ȥ����뤳�Ȥ��Ǥ��롣�錄���� Intel �� Linux �ܥå�
���Ǥϼ��Τ褦�ʷ�̤�ɽ�����줿��
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGIOT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
�����ʥ���ֹ�ϡ�Alpha AXP �� Linux �ܥå����Ǥϰۤʤä���Τˤʤ롣�ץ��� ���ϡ��������줿�����ʥ������ʬ��̵�뤹�뤳�Ȥ�Ǥ��뤬���դ��Ĥ���ͭ̾�� �㳰�����롣�ץ������μ¹Ԥ���ߤ����� SIGSTOP �����ʥ�ȡ��ץ�������λ���� �� SIGKILL �����ʥ�Ǥ��ꡢ������̵��Ǥ��ʤ�������ʳ��ˤĤ��Ƥϡ��ץ����� ���͡��ʥ����ʥ��ɤ��������뤫��ʬ������Ǥ��롣�ץ������ϥ����ʥ�� �֥��å����뤳�Ȥ��Ǥ��뤬���֥��å����ʤ����ϡ���ʬ���Ȥǽ������뤫�� ���뤤�ϥ����ͥ�˽������Ƥ�餦���Ȥ�Ǥ��롣 �����ͥ뤬�����ʥ����������硢���Υ����ʥ� ���᤹��ǥե���Ȥι٤��¹Ԥ���롣���Ȥ��С��ץ������� SIGFPE (floatin point exception)�����ʥ�������ä��ݤΥǥե���Ȥι٤ϡ�core dump ��Ԥä� ��λ���뤳�ȤǤ��롣�����ʥ�ˤϡ����Ū������Ūͥ���̤Ȥ��ä���ΤϤʤ��� �ҤȤĤΥץ��������Ф��Ƥդ��ĤΥ����ʥ뤬Ʊ�����������줿��硢����餬�ץ� �������Ϥ������֤⡢�ץ��������������٤����֤��ޤäƤ��ʤ����ޤ���Ʊ�� ����ν�ʣ���������ʥ���������ᥫ�˥���Ȥ����Τ�¸�ߤ��ʤ����ץ������ϡ� SIGCOUNT ��ҤȤĤ���������ä��Τ�������Ȥ⤽��� 42 �ļ�����ä��Τ��� �������Ȥ�������٤���ˡ������ʤ���
Linux �Υ����ʥ�μ����Ǥϡ��ץ�������
task_struct
��¤�Τ���¸���줿�������Ѥ���롣
���ݡ��Ȥ���륷���ʥ�ο��ϡ��ץ����å��Υ��(
word)�����������¤���Ƥ��롣
32 �ӥåȤΥ�ɥ���������ĥץ����å��ϡ�32 �ĤΥ����ʥ����Ĥ��Ȥ������
����Alpha AXP �Τ褦�� 64 �ӥåȥץ����å��Ǥ� 64 �ĤޤǤǤ��롣
�ޤ������κѤ�Ǥ��ʤ������ʥ�ϡ�task_struct
��
signal
�ե�����ɤ���¸���졢
blockd
�ե�����ɤ˥֥��å����줿�����ʥ��
�����ʥ�ޥ���(
signal mask)���ݻ�����롣
SIGSTOP �� SIGKILL ������ơ����٤ƤΥ����ʥ�ϥ֥��å����뤳�Ȥ��Ǥ��롣
�֥��å����줿�����ʥ뤬���������ȡ�����ϥ֥��å����������ޤ�̤����
���֤�α�ޤ롣�ޤ���Linux �ϡ��ġ��Υץ�������������뤫�⤷��ʤ�������
�����ʥ��ɤ���������Τ��˴ؤ��������ݻ����Ƥ���Τ��������ξ����
sigaction
�ǡ�����¤�Τ��������¸���졢�ġ�
�Υץ������� task_struct
�ǡ�����¤�Τˤ�äƥݥ���Ȥ���Ƥ��롣
����ʳ��ˤ⡢task_struct
�ˤϡ������ʥ���������롼����Υ��ɥ쥹�����⤷���ϥե饰�Τ����줫
���ޤޤ�Ƥ��롣�ե饰��Ȥ���硢�ץ������ϡ����������ʥ��̵�뤹�뤫��
���Υ����ʥ�ν������ͥ����Ԥ����뤫�Υե饰�ˤ�ä� Linux �������롣
�ץ������ϡ������ƥॳ�����Ȥäƥ����ʥ���Ф���ǥե���Ƚ������ѹ����뤳��
���Ǥ������Υ����ƥॳ����ˤ�ä�Ŭ�ڤʥ����ʥ�˴ؤ��� sigaction
��¤�Τ��ѹ������ꡢblockd
�ޥ������Ѳ��������ꤹ�롣
�����ƥ������ץ�������¾�ΤɤΥץ������ˤ⥷���ʥ�������Ȥ����櫓�Ǥ�
�ʤ����������ͥ�ȥ����ѡ��桼���ˤϤ��줬��ǽ�Ǥ��롣�̾�Υץ������ϡ�
Ʊ�� uid
�� gid
����ĥץ���������Ʊ���ץ��������롼�פ�
°����ץ������ˤΤߥ����ʥ������롣
(����1)
�����ʥ�������ϡ�
task_struct
�� signal
�ե�����ɤˤ���Ŭ�ڤʥӥåȤ�
���åȤ��뤳�Ȥˤ��٤���롣�ץ������������ʥ��֥��å�
���Ƥ��餺���Ե�����������߲�ǽ��(INTERRUPTIBLE ��)���֤ˤ����硢���Υץ�
�����ϡ��ܤ�Фޤ��Ƽ¹���(RUNNING)���֤��֤��졢�¹ԥ��塼����Ͽ����ơ�����
��Ͽ���ǧ����롣����ˤ�äơ��������塼��ϡ������ƥ�μ��Υ������塼���
�����ơ����Υץ�������¹Ԥθ���Ԥȸ��ʤ����ǥե���Ȥν�����ɬ�פʾ�硢
Linux �Ϥ��Υ����ʥ�ν������Ŭ���Ǥ��롣���Ȥ��С������ʥ� SIGWINCH
(X Window �Υե��������ѹ�)���������졢������Ф��ƥǥե���ȤΥϥ�ɥ餬����
�������ϡ����Υϥ�ɥ�ˤ�ä�Ŭ�ڤʽ������ʤ����Τǡ�����ʳ������̤�
�����Ϥʤ���ʤ���
�����ʥ����������Ƥ����˥ץ��������Ϥ����櫓�ǤϤʤ��������ϥץ�������
�ƤӼ¹Ԥ����ޤ��Ԥ��ʤ���Фʤ�ʤ����ץ������������ƥॳ����ˤ�äƽ�λ
����Ȥ��Ϥ��ĤǤ⡢
signal
��
blocked
�ե�����ɤ������å�
���졢�⤷�ץ�������ͽ��֥��å����Ƥ��ʤ������ʥ뤬¸�ߤ�����ϡ����λ�����
�褦�䤯�ץ������˥����ʥ���Ϥ����Ȥ��Ǥ��롣��������˿��������㤤��ˡ��
�פ��뤫�⤷��ʤ����������ƥ���Τ��٤ƤΥץ������ϡ��Ͻ������ƥॳ�����
ȯ���ơ����Ȥ��С�ü����ʸ���������ꤷ�Ƥ���Τǡ������������ȤߤϤ���
���ʤ���ΤǤ��롣���������ץ������ϡ���ʬ��˾����ϡ����饷���ʥ��Ԥ���
���֤ˤʤ뤳�Ȥ�Ǥ��롣���ξ�硢�����ʥ뤬������ޤǡ������߲�ǽ��
�����ڥ�ɾ��֤Ȥʤ롣���κݡ�Linux �Υ����ʥ�����Υ����ɤϡ����ߥ֥��å�
����Ƥ��ʤ������ʥ�������뤿�Ӥˡ�
sigaction
��¤�Τ�Ĵ�٤롣
�ץ������Υ����ʥ�ϥ�ɥ餬�ǥե���Ȥ˥��åȤ���Ƥ����硢�����ͥ뤬
���Υ����ʥ��������롣SIGSTOP �����ʥ�Υǥե���ȤΥϥ�ɥ�ϡ����ߤΥץ�
�����ξ��֤���߾���(STOPPED)�Ȥ����������塼���ư���ƿ������ץ�������¹�
���롣SIGFPE �����ʥ�Υǥե���Ȥν����ϡ����Υץ������� core dump ������
�����λ�����롣ȿ�Фˡ��ץ���������ʬ���ȤΥ����ʥ�ϥ�ɥ����ꤹ�뤳��
��Ǥ��롣����ϡ����Υ����ʥ뤬����������ɬ���ƤӽФ����롼����Ȥ�
�ꡢ
sigaction
��¤�Τ����Υ롼����Υ���
�쥹���ݻ����롣���ξ�硢�����ͥ�ϥץ������Υ����ʥ�����롼�����Ƥӽ�
���ʤ���Фʤ餺�����θƤӽФ���ˡ�ϥץ����å��˸�ͭ�Τ�ΤǤ��뤬��
���٤Ƥ� CPU ���н褷�ʤ���Фʤ�ʤ����¤Ȥ��ơ������ͥ�⡼�ɤǼ¹Ԥ����
���륫���ȥץ������ϡ������ͥ�䥷���ƥ�롼�����ƤӽФ������Υ桼���⡼
�ɤΥץ������ؤ�������Ȥ��Ƥ���Ȥ������ȤǤ��롣
����������褹�뤿��ˡ��ץ������Υ����å��ȥ쥸����������롣�ץ�������
�ץ�����५���ˤϡ����Υ����ʥ�����롼����Υ��ɥ쥹�����ꤵ�졢
���Υ롼����ؤΥѥ�����������ե졼����ղä���뤫���쥸�������Ϥ���롣
�ץ��������ƤӼ¹ԤϤ���Ȥ��������ʥ�����롼������̾��̤�ƤӽФ��줿
���Τ褦�˸����롣
Linux �� POSIX �˽�Ƥ���Τǡ��ץ������ϡ�����Υ����ʥ�����롼���� ���ƤӽФ��줿�Ȥ������Υ����ʥ��֥��å����뤫�ɤ������꤬�Ǥ��롣 ����ϡ��ץ������Υ����ʥ�����롼����θƤӽФ����ʤ���Ƥ���֤˥֥��å� �ޥ������ѹ����뤳�Ȥ��̣���롣�����ʥ�����롼����λ�����顢���Υ֥��å� �ޥ������ͤϸ����ᤵ��ʤ���Фʤ�ʤ����������äơ�Linux �ϡ��ҤŤ��ѤΥ롼 ����(tidy up routine)�ؤΥ�������ɲä��ơ����Υ롼�������ʥ�������ä� �ץ������Υ����륹���å���Υ֥��å��ޥ������᤹�� �ޤ���Linux �ϡ�ʣ���Υ����ʥ�����롼����θƤӽФ���ɬ�פʾ�硢������ �����å����Ѥ�Ǥ����ơ��ҤȤĤν����롼����λ�����鼡�Υ롼�����ƤӽФ� �����֤��ơ��Ǹ���ҤŤ��롼�����ƤӽФ��Ȥ�����ˡ�Ǥ��������������Ŭ �����Ƥ��롣
����Ū�� Linux ������ϡ����٤ƥ�����쥯�����(redirection)�ݡ��Ȥ��� ���롣���Ȥ��С����Τ褦�ʥ�����쥯������롣
$ ls | pr | lpr
�嵭����Ǥϡ��ǥ��쥯�ȥ���Υե������ɽ������ ls
���ޥ�ɤ�
���Ϥ�ѥ��������ơ�pr
���ޥ�ɤ�ɸ�����Ϥ˿�������ơ�pr
�˥ڡ����������롣�������ơ����Υ��ޥ�ɽ��Ϥ�ѥ��������ơ�lpr
���ޥ�ɤ�ɸ�����Ϥ˿�������ơ��ǥե���ȥץ��Ǥ��η�̤�ץ��Ȥ���
�Ƥ��롣���ʤ�����ѥ��פȤϡ�����ץ�������ɸ����Ϥ��̤Υץ�������ɸ������
�ؤȷҤ��������������ä��Х��ȥ��ȥ��Ǥ��롣���ξ�硢�ɤ���Υץ�����
�������쥯������ռ��������̾��̤�˿������ץ������֤ˤ����ΰ��Ū
�ʥѥ��פ����ꤹ��Τϥ���������ܤǤ��롣
��ɽ(5.1) �ѥ���
Linux �ˤ����ơ��ѥ��פμ����ˤϡ��դ��Ĥ�
file
�ǡ�����¤�Τ����Ѥ���롣������Τ���ʪ���ڡ�����ݥ���Ȥ��� VFS
inode ����Ū�˺������ơ������դ��Ĥι�¤�Τ�Ʊ���˥ݥ���Ȥ���ΤǤ��롣
��ɽ(5.1)�Ǥϡ����줾��� file
�ǡ�����¤�Τ����ե��������롼����
������ΰۤʤ����Ǥ�ݥ���Ȥ��Ƥ����ͻҤ�������Ƥ��롣�ҤȤĤϡ��ѥ��פ�
�ν��ߤǤ��ꡢ�⤦�ҤȤĤϡ��ѥ��פ�����ɤ߽Ф��Ǥ��롣
[see: include/linux/inode_fs_i.h](�ޥ�)
(����:
pipe_fs_i.h ��)
������ˡ�Ǥϡ��̾�ե�����ؤν��߽������ɤ߽Ф����������ѥ����ƥ�
������֤ˤ������Ū�ʰ㤤�ϱ��ä���롣���ߥץ��������ѥ��פ˽����
�����Х�����϶�ͭ�ǡ����ڡ����˥��ԡ����졢�ɤ߽Ф��ץ��������ѥ��פ����ɤ�
�Ф��Ȥ��ϡ��Х������ζ�ͭ�ǡ����ڡ������饳�ԡ�����롣Linux �ϡ�����
�ѥ��פؤΥ���������Ʊ�������ʤ���Фʤ�ʤ���Linux �ϡ��ѥ��פ�����ɤ߽Ф�
�ȡ������ؤν��ߤȤ��μ¤���Ĵ���碌��褦�ˤ��ʤ���Фʤ餺�����Τ���
�� Linux �ϡ����å�(
lock)���Ԥ�����(
wait queue)�䥷���ʥ�(signal)�Ȥ��ä�����
�ߤ����Ѥ��Ƥ��롣
���ߥץ��������ѥ��פ˽��⤦�Ȥ���Ȥ��ϡ�ɸ��ν��ߥ饤�֥��
�ؿ�����Ѥ��롣
�����δ֤Ǥ���ꤵ���ե�����ǥ�������ץ��Ϥ��٤ơ����ߥץ���
�������İ�Ϣ��
file
�ǡ�����¤�ΤؤΥ���ǥ�
�����ȤʤäƤ��ơ������ġ��ι�¤�Τ������ץ줿�ե����롢���ξ��ˤ�
�����ץ줿�ѥ��פ�ɽ���Ƥ��롣
Linux �Υ����ƥॳ���뤬���Ѥ�����ߥ롼����ϡ����Υѥ��פҤ���
file
�ǡ�����¤�Τˤ�äƥݥ���Ȥ��줿�롼����Ǥ��롣����
�롼����������������ݤ����Ѥ������ϡ����Υѥ��פ�ɽ�� VFS
inode
���ݻ����줿����Ǥ��롣
[see: pipe_write(), in
fs/pipe.c]
�ѥ��פؽ��⤦�Ȥ������Х����̤��ݻ���������ζ�������ͭ�ڡ������¸�ߤ���
�ѥ��פ��ɤ߽Ф��ץ������ˤ�äƥ��å�����Ƥ��ʤ���硢Linux �Ͻ���
�ץ������Τ���ˤ��Υѥ��פ���å����ơ����ޤ��٤��Х���������
�ץ������Υ��ɥ쥹���֤��鶦ͭ�ǡ����ڡ����˥��ԡ����롣
�ѥ��פ��ɤ߽Ф��ץ������ˤ�äƥ��å�����Ƥ��뤫���ǡ������ݻ����뽼ʬ�ʶ�
�����ڡ�����¸�ߤ��ʤ����ϡ����ߤΥץ��������ѥ��פ� inode
���Ԥ�
�����ǥ�����֤ˤ��졢�������塼�餬�ƤӽФ���ơ�¾�Υץ��������¹�
����롣
���ߥץ������ϳ����߲�ǽ�Ǥ���Τǡ������ʥ�μ�������ǽ�Ǥ��롣
���ߥץ������ϡ��ǡ������ߤΤ���ν�ʬ�ʥ��ڡ��������ݤ���뤫
�ѥ��פΥ��å���������줿�Ȥ��ˡ��ɤ߹��ߥץ������ˤ�äƥ�����֤���
��������롣
�ǡ��������ޤ��Ȥ����ѥ��פ� VFS inode �Υ��å��ϲ�����졢
���� inode ���Ԥ������ǥ�����֤ˤʤäƤ����ɤ߽Ф��ץ�����������С�
�ɤ߽Ф��ץ������⤽��ˤ�ä��ܤ�Фޤ���
�ѥ��פ���Υǡ������ɤ߽Ф��ϡ����ߥץ����������ˤ褯���Ƥ��롣
[see: pipe_read(), in
fs/pipe.c]
�ץ������ϡ��֥��å����ʤ��ɤ߽Ф�(non-blocking read)�뤳�Ȥ�
������롣(����ϡ��ץ��������ե������ѥ��פ��ץ�Ȥ��Υ⡼�ɤ�
��¸���롣)�����ơ����ξ�硢�ɤ߽Ф��٤��ǡ������ʤ������ѥ��פ����å������
������ϡ����顼���֤���롣����ϡ����Υץ��������¹Ԥ��³�Ǥ��뤳�Ȥ�
��̣���롣����ʳ�����ˡ�Ȥ��ơ��ѥ��פ� inode ���Ԥ������ǵٻߤ��ơ�����
�ץ������ν�λ���ԤĤ��Ȥ��ǽ�Ǥ��롣ξ���Υץ��������ѥ�������λ����
�ȡ��ѥ��פ� inode �Ȥ��ζ�ͭ�ǡ����ڡ����Ȥ��˴�����롣
Linux �ϡ�̾���դ��ѥ��פ⥵�ݡ��Ȥ��Ƥ��롣�ѥ��פ���������Ф�(First In,
First Out)�θ����ǽ�����Ԥ��Τǡ�̾���դ��ѥ��פ� FIFO �Ȥ�ƤФ�롣
�ѥ��פ˽��ޤ줿�ǽ�Υǡ����ϡ��ѥ��פ����ɤ߽Ф����ǽ�Υǡ����Ȥ�
�롣�̾�Υѥ��פȤϰۤʤꡢFIFO �ϰ��Ū�ʥ��֥������ȤǤϤʤ����ե����륷��
�ƥ���μ��ΤǤ��ꡢmkfifo
���ޥ�ɤˤ�äƺ�������ǽ�Ǥ��롣
�ץ������ϡ�������Ф���Ŭ�ڤʥ����������¤���ĸ¤ꡢ��ͳ�� FIFO �����Ѥ���
���Ȥ��Ǥ��롣FIFO ���ץ���ˡ�ϡ��̾�Υѥ��פΤ���ȤϾ����ۤʤ롣
�̾�Υѥ���(�դ��Ĥ� file
�ǡ�����¤�Ρ�VFS inode �Ȥ��ζ�ͭ�ǡ���
�ڡ����Υ��å�)��ɬ�פ˱����ư��Ū�˺�����������������FIFO �Ϥ��Ǥ�
¸�ߤ�����ΤǤ��ꡢ�桼���ˤ�äƥ����ץ졢������������롣Linux �ϡ�
���ߥץ������� FIFO ���ץ������ɤ߽Ф��ץ������ˤ�����ץ�
�������ߥץ�����������˽���Ǥ��ޤ������ɤ߽Ф��ץ�������������ɤ��
���֤ˤ���褦�����������ʤ���Фʤ�ʤ�������������������
���Ȥ�����ȡ�FIFO �ν����ϡ��̾�Υѥ��פν�����ˡ�ȤۤȤ������Ʊ��Ǥ��ꡢ
ξ�Ԥ�Ʊ���ǡ�����¤�Ƚ����ᥫ�˥����ȤäƤ��롣
REVIEW NOTE: Add when networking chapter written.
Linux �ϡ�Unix System V (1983) �ǽ����о줷���ץ��������̿�(IPC)�λ��Ȥ� �� 3 ���ॵ�ݡ��Ȥ��Ƥ��롣�����ϡ���å��������塼(message queue)�����ޥե� (semaphore)�������ƶ�ͭ����(shared memory)�Ǥ��롣������ System V IPC �� ���ȤߤϤ��٤ƶ��̤�ǧ����ˡ�����Ѥ��Ƥ��롣�ץ���������ͭ������� ���������Ǥ���Τϡ������ƥॳ�����ͳ�ǥ����ͥ���Ф��ƥ�ˡ����ʻ��ȼ��̻� (reference identifier)���Ϥ����������Ǥ��롣 ������ System V IPC ���֥������ȤؤΥ�������������å����� ���ˤϡ����������ѡ��ߥå�����Ѥ���뤬������ϥե�����ؤΥ������� �����å������������ΤǤ��롣System V IPC ���֥������ȤؤΥ����������¤ϡ� ���Υ��֥������Ȥκ����Ԥˤ�äƥ����ƥॳ�����ͳ�����ꤵ��롣�ġ��� IPC �ᥫ�˥���ϡ����֥������Ȥλ��ȼ��̻Ҥ�����ơ��֥�ؤΥ���ǥå����� �������Ѥ��Ƥ��롣�������������ñ��ʥ���ǥå����ǤϤʤ������Υ���ǥå��� �����ˤ�¿��������ɬ�פȤ��롣
Linux �����ƥ��� System V IPC ���֥������Ȥ�ɽ�����٤ƤΥǡ�����¤�ˤϡ�
ipc_perm
��¤�Τ��ޤޤ�Ƥ��롣�����ơ�
���ι�¤�Τˤϡ����Υ��֥������Ȥν�ͭ�ץ���������Ӻ����ץ������Υ桼�� ID
�ȥ��롼�� ID �Ȥ��ޤޤ�롣
[see:
include/linux/ipc.h]
�ޤ���ipc_perm
�ˤϡ����Υ��֥������ȤؤΥ��������⡼��(��ͭ�ԡ�
���롼�ס�����¾)�� IPC ���֥������ȥ���(
key
)��ޤޤ�Ƥ��롣
�����ϡ�System V IPC ���֥������Ȥλ��ȼ��̻Ҥ�õ�����ʤȤ��ƻ��Ѥ���롣
���ݡ��Ȥ���Ƥ��륭���ˤϡ��ץ饤�١���(private)�ȥѥ֥�å�(public)�������
�����롣�������ѥ֥�å��ξ�硢�ɤΤ褦�ʥץ������Ǥ⡢����������������å�
���줿�塢���� System V IPC ���֥������Ȥλ��ȼ��̻ҤĤ��뤳�Ȥ��Ǥ��롣
System V IPC ���֥������Ȥϡ������Ǥϻ��ȤǤ��ʤ��褦�ˤʤäƤ��ơ����λ���
���̻ҤǤΤ��Ȥ���ǽ�ȤʤäƤ��롣
��å��������塼(message queue)�Ȥϡ��ҤȤİʾ�Υץ���������å��������
������ǡ������ҤȤİʾ���ɤ߽Ф��ץ������ˤ�ä��ɤ߽Ф����Ȥ��ǽ�ˤ���
���ȤߤǤ��롣Linux �ϡ���å��������塼�Υꥹ�Ȥ�
msque
����ˤ�äƴ������Ƥ��롣��������θġ������Ǥϡ�
msqid_ds
�ǡ�����¤�Τ�ݥ���Ȥ��Ƥ�
�ơ����ι�¤�Τ��ġ��Υ�å��������塼�����˵��Ҥ��Ƥ��롣��å��������塼��
���������Ȥ��������� msqid_ds
�ǡ�����¤�Τ������ƥ���꤫����
���Ƥ�졢����Τʤ�����������롣
[see:
include/linux/msg.h]
��ɽ(5.2)System V IPC ��å��������塼
�ġ���
msqid_ds
��¤�Τˤϡ�
ipc_perm
�ǡ�����¤�ΤȤ��Υ��塼�������줿
��å������ؤΥݥ����ޤޤ�Ƥ��롣����ˡ�Linux �ϡ����塼���ѹ����֤�Ͽ
���Ƥ��ꡢ���Ȥ��Ф��Υ��塼�˽��ߤ��ʤ��줿�Ǹ�λ��֤Ȥ��ä�������ݻ�
���Ƥ��롣msqid_ds
�ˤϡ��դ��Ĥ��Ԥ����ޤޤ�Ƥ��ơ����줾��
��å��������塼�ؤν��ߥץ��������Ф����Τ��ɤ߽Ф��ץ��������Ф���
��ΤȤʤäƤ��롣
�ץ����������ߥ��塼�˥�å���������⤦�Ȥ���Ȥ��Ϥ��Ĥ⡢����
�¸��桼�� ID �ȼ¸����롼�� ID �Ȥ������Υ��塼�� ipc_perm
�ǡ���
��¤�Τˤ���⡼�ɤ���Ӥ���롣
�ץ����������Υ��塼�˽��߲�ǽ�ʾ�硢��å������ϡ����Υץ������Υ��ɥ�
�����֤���
msg
�ǡ�����¤�Τؤȥ��ԡ����졢��
�Υ�å��������塼�κǸ���֤���롣�ġ��Υ�å������ˤϡ���Ĵ����ץ������֤�
��դ��줿���ץꥱ��������ͭ�Υ�����(type)�������դ�����롣��������Linux
�ϡ����߲�ǽ�ʥ�å������ο���Ĺ�������¤��Ƥ���Τǡ���å������ν���
�κݤ����̤���ʤ���礬�������롣���ξ�硢���Υץ�������������å�����
���塼�ν��ߥ��塼�˲ä���졢�������塼�餬�ƤӽФ���ơ��������ץ�����
���¹Ԥ���롣�����ơ������Ĥ��Υ�å����������Υ�å��������塼�����ɤ߽Ф�
�줿�Ȥ��ˡ���ۤɤΥץ���������������롣
���塼������ɤ߽Ф���Ʊ�ͤβ�����é�롣���١����ߥ��塼���Ф���ץ��� ���Υ����������������å�����롣�ɤ߽Ф��ץ������ϡ���å������Υ����פ˴ط� �ʤ����塼�κǽ�Υ�å�������������뤫������Υ����פΥ�å����������� ���Τ����줫�����뤳�Ȥ��Ǥ��롣������˹��פ����å��������ʤ���硢 �ɤ߽Ф��ץ������ϥ�å��������塼���ɤ߽Ф��Ԥ�����˲ä����ơ��������塼 �餬�¹Ԥ���롣��������å����������塼�˽��ޤ��ȡ����Υץ������ϵ��� ����ƺƤӼ¹Ԥ���롣
�Ǥ�ñ��ʷ����ǹͤ���ȡ����ޥե��Ȥϡ�ʣ���Υץ������ˤ�ꡢ�����ͤ�ƥ��� (test)�����ꥻ�å�(set)�����ꤹ�뤳�Ȥ���ǽ�ʡ������ξ��Ǥ��롣 �ƥ��Ȥȥ��åȤ����ϡ��ġ��Υץ������˴ؤ���¤ꡢ�����ߤ��Ǥ��ʤ����⤷ ����¾�Υץ��������鴳�Ĥ�����ʤ�(atomic)���Ǥ��롣���ʤ�������ä���ץ� ����������Ϥ���¾�Υץ������������ߤ�뤳�ȤϤǤ��ʤ����ƥ��Ȥȥ��å� �����η�̤ϡ����Υ��ޥե��θ��ߤ��ͤȥ��åȤ����ͤȤ��¤Ȥʤ롣���åȤ��� ���ͤϡ����ξ�����ξ��⤢�롣�ƥ��Ȥȥ��åȤ����η�̤ˤ�äƤϡ����� �ץ���������¾�Υץ������ˤ�äƥ��ޥե����ͤ��ѹ������ޤǡ��ٻߤ��ʤ���� �ʤ�ʤ���礬�����롣���ޥե��ϡ����˽��פʥ����ΰ������������Ȥ��� ���Ѥ��뤳�Ȥ��Ǥ������٤�ñ��Υץ������������¹Ԥ��٤����˽��פʥ����ɤ� �ΰ����Ф����Ȥ��Ǥ��롣
���Ȥ��С���Ĵ����Ư��¿���Υץ����������ꡢ������ñ��Υե�������ɤ߹� ����ꡢ����˽�����ꤷ�Ƥ���Ȥ��롣�����ơ����Υե�����ؤΥ��������� ������Ĵ���������ȻפäƤ���Ȥ��롣���ξ�硢���ޥե���Ȥ�������ͤ� 1 �� ���ꤷ���ե����������ɤ���ˡ��դ��ĤΥ��ޥե������ɤ�ä��롣�ҤȤ� �ϡ����ޥե����ͤ�ƥ��Ȥ��ơ������ͤ��� 1 �������Ρ��⤦�ҤȤĤϡ����ޥե� �ͤ�ƥ��Ȥ����ͤ� 1 ������ΤǤ��롣 �ե�����˥�����������ǽ�Υץ������ϡ����ޥե����ͤ��� 1 ��������Ȥ�������� ��������Х��ޥե����ͤ� 0 �ˤʤ롣���Υץ������Ͻ�����³���ơ��ǡ����ե����� ����Ѥ��뤬���⤷���Υץ������������Ȥ������Ȼפäƥ��ޥե����ͤ��� 1 ����� ���Ȥ��Ƥ⡢���η�̤� -1 �ˤʤäƤ��ޤ��ΤǼ��Ԥ��롣 ���Υץ������ϡ��ǽ�Υץ��������ǡ����ե�����λ��Ѥ���ޤǡ���߾��֤� �ʤ롣�ǽ�Υץ��������ǡ����ե�����λ��Ѥ����顢���ޥե����ͤ� 1 �� ���ơ�1 ���᤹�����λ����ǡ��Ե����Ƥ����ץ���������������ơ�����ϥ��ޥե��� �� 1 ����(����: -1 ����)���Ȥ��������롣
��ɽ(5.3)System V IPC ���ޥե�
System V IPC ���ޥե����֥������Ȥϡ����줾�줬���ޥե�����Ҥ��Ƥ��ꡢ
Linux �ϡ�
semid_ds
�ǡ�����¤�Τ���Ѥ���
�����ɽ�����롣
[see
include/linux/sem.h]
�����ƥ��Τ��٤Ƥ� semid_ds
�ǡ�����¤�Τϡ�
semary
�Ȥ����ݥ�������ˤ�äƥݥ���Ȥ���Ƥ��롣
�ġ��Υ��ޥե�����ˤϡ�
sem_nsems
�Ĥ�
���Ǥ����ꡢ�ơ��Υ��ޥե���������Ǥϡ�
sem
�ǡ�����¤�Τˤ�국�Ҥ���Ƥ��ơ�sem
��¤�Τ�
sem_base
�ˤ�äƥݥ���Ȥ���Ƥ��롣
System V IPC ���ޥե����֥������Ȥ������륻�ޥե���������������Ƥ��뤹�٤�
�Υץ������ϡ������ƥॳ������������ơ����������롣
�����ƥॳ�����¿����������ꤹ�뤳�Ȥ��Ǥ��뤬���ġ������ϡ����ޥե�
����ǥå���(semaphore index)�����ڥ졼�������(operation value)������Ӱ�Ϣ��
�ե饰(a set of flag)�Ȥ��� 3 �Ĥ����Ϲ��ܤˤ�äƵ��Ҥ���롣
���ޥե�����ǥå����Ȥϡ����ޥե�����ؤΥ���ǥå����Ǥ��ꡢ���ڥ졼�����
�ͤȤϡ����ޥե��θ��ߤ��ͤ˲ä���٤����ͤǤ��롣
Linux �Ϥޤ������٤Ƥ��������������ɤ�����ƥ��Ȥ��롣����������Τϡ�
���ޥե��θ��ߤ��ͤ˥��ڥ졼������ͤ�ä����ͤ���������礭�������⤷����
���ڥ졼������ͤȥ��ޥե��θ��ߤ��ͤ�ξ���������ξ��Τ����줫�Ǥ��롣
���ޥե����ҤȤĤǤ⼺�Ԥ������ǡ�¾�Υץ�������֥��å����ʤ�
(non-blocking)�����ƥॳ����ڥ졼�����ե饰���ᤷ�ʤ���硢Linux �ϡ�
�ץ��������ڥ�ɤ��롣
�ץ������������ڥ�ɾ��֤ˤʤ�ȡ�Linux �ϼ¹Ԥ����٤����ޥե����ξ���
(state)����¸���ơ����ߤΥץ��������Ԥ�����(wait queue)����֤��ʤ���Фʤ�
�ʤ���
���ν����ϡ������å���
sem_queue
�ǡ���
��¤�Τ�������ơ�ɬ�פʾ������ळ�Ȥˤ�äƤʤ���롣������ sem_queue
�ǡ�����¤�Τϡ����Υ��ޥե����֥������Ȥ��Ԥ�����κǸ���֤�
��롣(���κݤϡ�
sem_pending
��
sem_pending_last
�ݥ������Ѥ���롣)
���ߤΥץ������ϡ�sem_queue
�ǡ�����¤�Τ��Ԥ�������(�ٻ߾��֤�)��
���졢�������塼�餬�ƤӽФ���ơ����Υץ��������¹Ԥ���롣
�⤷���ޥե������٤������������ߤΥץ���������ߤ�����ɬ�פ��ʤ���С�
Linux �Ͻ������³�������ޥե������Ŭ�ڤʥ��С��ˤ�������Ŭ�Ѥ��롣
���λ����ǡ�Linux �ϡ��Ԥ����֤���߾��֤ˤ���ץ����������줾��Υ��ޥե�
����Ŭ�ѤǤ��뤫�ɤ���������å����롣Linux �ϡ����롼����Υڥ�ǥ���
���塼(pending queue)(
sem_pending
)���
�С����줾�����֤˸��ơ�����Ϥ��Υ��ޥե����������뤫�ɤ�����ƥ���
���롣
����������硢Linux �ϡ��ڥ�ǥ��ꥹ�Ȥ��餽�� sem_queue
�ǡ���
��¤�Τ������ơ����ޥե�����ˤ��Υ��ޥե�����Ŭ�Ѥ��롣
Linux �ϡ���̲��Υץ����������ơ����˥������塼�餬�¹Ԥ����Ȥ��˺ƻ�ư
�����褦�ˤ��롣Linux �ϡ��ڥ�ǥ��ꥹ�Ȥ�ǽ餫����Ĵ�٤Ƥ��äơ�
Ŭ�ѤǤ��륻�ޥե���̵���ʤꡢ����ʾ�ץ����������ʤ��ʤ�ޤ�
�����³���롣
���ޥե��ˤϡ��ǥåɥ��å��Ȥ������꤬���롣���줬������Τϡ�����ץ�����
�������פʥ����ΰ�����ä��Ȥ��Τˡ�����å��夹�뤫 kill ����뤫���Ƥ���
����Ф��ʤ��ʤꡢ���ޥե��ͤ��ѹ����줿�ޤޤˤʤ���Ǥ��롣Linux �Ϥ����
�ɻߤ��뤿��ˡ����ޥե�������Ф���Ĵ��(adjustment)�ꥹ�Ȥ�������Ƥ��롣
���Υ����ǥ��ϡ����ޥե������Ĵ����Ŭ�Ѥ����ȡ����ޥե��������������
�ץ���������Ŭ�Ѥ�������ξ���(state)���ᤵ���Ȥ������ȤǤ��롣
������Ĵ���ϡ�
sem_undo
�ǡ�����¤�Τ�
��¸����Ƥ��ơ������
semid_ds
�ǡ���
��¤�ξ�Υ��塼�Ȥ����Υ��ޥե������Ȥ��ץ�������
task_struct
�ǡ�����¤�ξ�Υ��塼�Ȥ��֤���롣
�ġ��Υ��ޥե����ϡ�Ĵ���Τ���Υǡ����������ʤ���뤵��뤳�Ȥ���̤���
�����礬���롣Linux �ϡ��ġ��Υ��ޥե�����ˤĤ��ơ��ץ��������������Ҥ�
�Ĥ�
sem_undo
�ǡ�����¤�Τ����������ʤ���
Ĵ�����᤹��ץ������������ҤȤĤ���äƤ��ʤ����ϡ�ɬ�פʤȤ��ˤҤȤĤ�
�ǡ�����¤�Τ���������롣������
sem_undo
�ǡ�����¤�Τϡ����Υץ�������
task_struct
�ǡ�����¤�ξ�Υ��塼�ȡ����ޥե������
semid_ds
�ǡ�����¤�ξ�Υ��塼�Ȥ�������롣
���ޥե������ޥե�����Υ��ޥե����Ф���Ŭ�Ѥ����Ȥ������ڥ졼�������
������դˤ����ͤ������Υץ������� sem_undo
�ǡ�����¤��Ĵ��
(adjustment)�������ˤ��륻�ޥե�����ȥ�˲ä����롣
����椨�����ڥ졼������ͤ� 2 �ξ�硢-2 �����Υ��ޥե���Ĵ������ȥ�˲ä�
���롣
�ץ���������λ���ƺ�������Ȥ���Linux �ϡ����Υץ�������
sem_undo
�ǡ�����¤�ΤΥ��åȤ�Ĵ�����ơ�
���ޥե�������Ф���Ĵ����Ŭ�Ѥ��롣���ޥե����åȤ�������줿��硢sem_undo
�ǡ�����¤�Τϡ��ץ�������
task_struct
�Υ��塼�˻Ĥä��ޤޤˤʤ뤬�����ޥե�����μ��̻Ҥ�
̵���ˤʤ롣���ξ�硢���ޥե����ҤŤ���(clean up)�����ɤ���ñ�ˤ��� sem_undo
��¤�Τ��˴����롣
��ͭ����(shared memory)�ϡ��ץ������β��ۥ��ɥ쥹���֤�Ǥ�դξ����ͳ ���ơ�ʣ���Υץ��������̿����뤳�Ȥ��ǽ�ˤ�����ȤߤǤ��롣��ͭ����벾�ۥ� ���Υڡ����ϡ��ġ��ζ�ͭ�ץ������Υڡ����ơ��֥���ˤ���ڡ����ơ��֥륨�� �ȥ�ˤ�äƻ��Ȥ���롣 ��ͭ�����ڡ����ϡ����٤ƤΥץ������β��ۥ������Ʊ�쥢�ɥ쥹�ˤʤ��Ƥ�� ����System V IPC �Υ��֥������Ȥ�Ȥ����Ϥ��٤ơ���ͭ���ꥨ�ꥢ�ؤΥ����� ���ϡ������ȥ����������¤Υ����å��ˤ�ä����椵��Ƥ��롣(�����ʥ��������� ���)���ä�����꤬��ͭ���줿�ʤ顢�ץ��������������Ѥ�����ˡ�ϥ����å� ����ʤ�������ؤΥ���������Ʊ������Ȥ��ä����Ȥϡ�¾�λ��Ȥߡ����Ȥ��С� System V �Υ��ޥե��ʤɤλ��Ȥߤ˰�¸���ʤ���Фʤ�ʤ���
��ɽ(5.4) System V IPC ��ͭ����
�������������줿�ġ��ζ�ͭ���ꥨ�ꥢ�ϡ�
shmid_ds
�ǡ�����¤�Τˤ�ä�ɽ����롣
�����ϡ�
shm_segs
�������¸����롣
[see: include/linux/sem.h](����:
include/linux/shm.h��)
shmid_ds
�ǡ�����¤�Τϡ����ζ�ͭ����Υ��ꥢ���礭������������
����ץ������ο�������Ӥ��ζ�ͭ���꤬�ץ������Υ��ɥ쥹���֤˥ޥåפ����
�����ͻҤ˴ؤ������Ҥ��Ƥ��롣���Υ���ؤΥ����������¤䡢
�������ѥ֥�å��������ץ饤�١��ȥ��������������Τϡ����ζ�ͭ����κ�����
�Ǥ��롣�ץ�������Ŭ�ڤʥ�������������äƤ���ʤ顢��ͭ�����ʪ�������
���å����뤳�Ȥ�Ǥ��롣
�����ͭ���褦�Ȥ���ġ��Υץ������������ʤβ��ۥ���˶�ͭ�ΰ��ĥ��
�դ���(attach)���ϡ������ƥॳ��������Ѥ��ʤ���Фʤ�ʤ��������ơ����Υ�
���ƥॳ����ˤ�ä�
vm_area_struct
�ǡ�����¤�Τ��������졢���줬�ץ������ζ�ͭ����Ҥ��롣
�ץ������ϡ���ͭ���꤬��ʬ�β��ۥ��ɥ쥹������Τɤ����֤���뤫������
���Ȥ��Ǥ��뤬����ʬ�ʹ����ζ��ΰ�γ��ݤ� Linux ��Ǥ���뤳�Ȥ�Ǥ��롣
������ vm_area_struct
��¤�Τϡ�vm_area_struct
�Υꥹ�Ȥ�
�������졢
shmid_ds
�ˤ�äƥݥ���Ȥ���
�롣
vm_next_shared
��
vm_prev_shared
�ݥ�������������
�뤿��˻��Ѥ���롣��ͭ�����ΰ�ϡ����ۥ����ĥ���դ���줿(attach)����
�Ǽºݤ�ʪ�������˺��������櫓�ǤϤʤ����ץ��������ǽ�ˤ����˥�������
���褦�Ȥ����Ȥ������ƺ�������롣
���ƥץ���������ͭ����Υڡ����ΤҤȤĤ˥������������Ȥ��ϡ��ڡ���
�ե���Ȥ�ȯ�����롣Linux �����Υڡ����ե���Ȥ��ä����Ȥ����ץ������ϡ�
��ͭ����Ҥ���
vm_area_struct
�ǡ�����¤�Τ�ȯ�����롣���ι�¤�Τˤϡ����ζ�ͭ����Υ����פ˹�碌������
�롼����ؤΥݥ����ޤޤ�Ƥ��롣��ͭ����ڡ����ե���Ƚ��������ɤϡ�
����
shmid_ds
���Ф���ڡ����ơ��֥륨��
�ȥ�Υꥹ�Ȥ�õ���ơ���ͭ���ۥ���γ����ڡ����˴ؤ��륨��ȥ꤬���뤫
�ɤ������ǧ���롣�⤷¸�ߤ��ʤ��ʤ顢ʪ���ڡ����������Ƥơ����Τ����
�ڡ����ơ��֥륨��ȥ��������롣�����ȥץ������Υڡ����ơ��֥�ˤ��Υ���
�ȥ꤬�դ��ä���Ʊ���ˡ�shmid_ds
�ˤ⤽�줬��¸����롣���ʤ����
�������Ƥ����С����Υ���˥����������褦�Ȥ��뼡�Υץ��������ڡ����ե����
�������Ȥ�����ͭ������������ɤϤ��ο������������줿ʪ���ڡ����Υ�
�������Τ���˻��ѤǤ���櫓�Ǥ��롣����椨����ͭ����˥������������ǽ��
�ץ�������ʪ�������ˤ���������Ƥ����Ȥǡ�¾�Υץ������ˤ�뤽��ʸ��
���������ϡ�����ʪ���ڡ������Υץ������β��ۥ��ɥ쥹���֤��ղä������
�ǺѤ�褦�ˤʤ롣
�ץ���������Ϥ䲾�ۥ���ζ�ͭ��ɬ�פȤ��ʤ��ʤä��Ȥ����ץ������ϼ��ʤ�
���ۥ��꤫�餽���ΰ��(detach)��¾�Υץ��������ޤ����Υ������Ѥ���
����¤ꡢ����(detach)���ϥ����ȥץ����������ˤ����ƶ����ʤ�������
vm_area_struct
�ϡ�
shmid_ds
�ǡ�����¤�Τ��������졢��������롣
�����ȥץ������Υڡ����ơ��֥뤬���åץǡ��Ȥ��졢��ͭ����Ƥ������ۥ���
�Υ��ꥢ��̵���ˤ���롣�����ͭ���Ƥ����Ǹ�Υץ���������ͭ�����ΰ��
����(detach)�Ȥ���ʪ������ˤ��붦ͭ����Υڡ����ϲ������졢���ζ�ͭ���
��˴ؤ��� shmid_ds
�ǡ�����¤�Τ��������롣
��ͭ���ۥ��꤬ʪ������˥��å�����ʤ��Ȥ��ϡ������ʣ���ʤ��Ȥ������롣 ���ξ�硢��ͭ����Υڡ����ϡ�ʪ������ξ��㤷���֤ϡ������ƥ�Υ� ��åץǥ������˥���åץ����Ȥ���롣��ͭ���꤬ʪ�����꤫�饹��åץ��� �Ȥ䥹��åץ������ˡ�ϡ� �֥���������ξϤDz��⤷�Ƥ��롣
(����1)�ץ��������롼�פˤĤ��ơ��������뤳�ȡ�(����: ��ʸ�ΤޤޤǤ���)