���� ���� ���� ���� ������ ���α׷��Ӹ� ���� ���̵�

�ý��� ȣ��:msgctl() (SYSTEM CALL:msgctl())

������ wrapper �Լ����� ������ �����Ǿ�����, �������α׷����� �޼��� ť�� �����, Ȱ���ϱ� ���� �����ϰ� ����� ���ٹ���� ������ �ִ�. �־��� �޼��� ť�� ������ ���� ����ü�� ���� �����ϱ� ���� ��п� �� ����.

�޼��� ť�� ���� ������ �����ϱ� ����, msgctl() �ý��� ȣ���� ����Ѵ�.


  SYSTEM CALL: msgctl();
  PROTOTYPE: int msgctl ( int msgqid, int cmd, struct msqid_ds *buf );
    RETURNS: 0 on success
             -1 on error: errno = EACCES (No read permission and cmd is IPC_STAT)
                                  EFAULT (Address pointed to by buf is invalid with IPC_SET and
                                          IPC_STAT commands)
                                  EIDRM  (Queue was removed during retrieval)
                                  EINVAL (msgqid invalid, or msgsz less than 0)
                                  EPERM  (IPC_SET or IPC_RMID command was issued, but
                                          calling process does not have write (alter)
                                          access to the queue)
  NOTES:

���� Ŀ�� �ڷ� ������ �������� ������ �� �ʵ��� ��̸� ������ �� ���� �ִ�. ���ེ���Ե�, ���α׷��ӵ��� �Ϻο��� ������ �ӹ��� �⵿����� IPC subsystem�� �����Ѵٸ� ��̷� �з��Ǿ� �� �� �ִ�. ���õ� ���ɾ� ������ ������ msgctl()�� ����Ͽ�, �糭�� ����ų ���ɼ��� ���� �������� ������ �� �ִ� �ɷ��� ���´�.

IPC_STAT

ť���� msqid_ds ����ü�� ��ȸ�Ͽ� ���� �ƱԸ�Ʈ�� �ּ����� �����Ѵ�.

IPC_SET

ť�� msqid_ds ����ü�� ipc_perm ����� ���� �����Ѵ�. ���� �ƱԸ�Ʈ�� ���� ���� ���Ѵ�.

IPC_RMID

Ŀ�η� ���� ť�� �����Ѵ�.

�޼��� ť�� ���� ���� �ڷ� ����(msqid_ds)�� ���� ����ߴ� ������ �������. Ŀ���� �ý��ۿ� �����ϴ� ������ ť�� ���� �̷��� ����ü�� �ϳ��� ������ �ִ�. IPC_STAT ���ɾ ����Ͽ� �˻縦 ���� �� ����ü�� ���纻�� ��ȸ�� �� �ִ�. ���� ������ ��ȸ�Ͽ� �Ѱ��� �ּҷ� �����ϴ� ���� wrapper �Լ��� ���캸��.:


int get_queue_ds( int qid, struct msgqid_ds *qbuf )
{
        if( msgctl( qid, IPC_STAT, qbuf) == -1)
        {
                return(-1);
        }
        
        return(0);
}

���� ���۷� ������ �� ���ٸ� ȣ���� �Լ����� -1�� ��ȯ�ȴ�. ��� ���� �� �Ǹ�, 0���� ��ȯ�ǰ� �Ѱ��� ���۴� �Ѱܹ��� ť Ȯ����(queue identifier,qid)�� ���� ��ǥ�Ǵ� �޼��� ť�� ���� ���� �ڷ� ������ ���纻�� ���´�.

ť�� ���� �ڷ� ����ü�� ���纻�� ������ ���� ��, � Ư���� ������ �� �ְ�, �װ͵��� ��� �����ų �� �ִ°�? �ڷ� ���� �ȿ��� ���� ������ �� �ִ� �������� ipc_perm ����̴�. �̰��� ����(owner)�� ������(creator)�� ���� ������ ����, ť�� �㰡���׵� �����Ѵ�. �׷����� ������ ���ִ� ipc_perm ����ü�� ������� mode,uid,gid ���̴�. ����(owner)�� user id, ����(owner)�� group id, ť�� ���� �㰡����(access permission)�� �ٲ� �� �ִ�.

ť�� ���(mode)�� �ٲٵ��� ���ȵ� wrapper �Լ��� ����� ����. ���(mode)�� ���� �迭�� �Ѱ����� �Ѵ� (i.e. "660").


int change_queue_mode( int qid, char *mode )
{
        struct msqid_ds tmpbuf;

	/* ���� �ڷ� ������ ���� ���纻�� ��ȸ�Ѵ� */
        get_queue_ds( qid, &tmpbuf);

	/* ������ �ⱳ�� ����Ͽ� �㰡����(permission)�� �����Ѵ� */
        sscanf(mode, "%ho", &tmpbuf.msg_perm.mode);

	/* ���� �ڷ� ������ �����Ѵ� */
        if( msgctl( qid, IPC_SET, &tmpbuf) == -1)
        {
                return(-1);
        }
        
        return(0);
}

get_queue_ds wrapper �Լ��� ������ ȣ���Ͽ� ���� �ڷ� ������ ���� ���纻�� ��ȸ�Ѵ�. ������ msg_perm ������ mode ����� �����ϱ� ���� sscanf()�� ȣ���Ѵ�. �� ���纻�� ���� ������ ������Ʈ�ϱ� ������ �ƹ��� ��ȭ�� �Ͼ�� �ʴ´�. �̷��� ���� IPC_SET ���ɾ ����Ͽ� msgctl()�� ȣ���Ͽ� ������ �� �ִ�.

����! ť�� �㰡������ ������ �� �ְ�, �׷��� �ؼ� ���Ǿƴϰ� �����θ� ���ܽ�ų �� �ִ�. ����϶�, �̷��� IPC ��ü���� ������ �����ϰų� �ý����� ��������� ������ �������� �ʴ´�. ���� ipcs�� ������ ť�� �� �� ���ٰ� �Ͽ� �������� �ʴ´ٴ� ���� �ǹ������� �ʴ´�.

�� ���� �����ϱ� ����, �ټ� ����ִ� ��ȭ�� �Ұ��ϰڴ�. South Florida ���п��� ���н� ���θ� ����ġ�� ����, ���� ���� ��Ȳ������ ������� ����(Blocking)�� �����ߴ�. �����㿡 ���� �����ϰ��� �������� ���� �����ھ��� �׽�Ʈ�ϰ� �������ϱ� ���� ������ ������ �����ߴ�. �׽�Ʈ�� �ϴ� ���ȿ� ���� �ڵ�ȿ� �޼��� ť�� �㰡����(permission)�� �����ϴ� Ÿ���� ������ٴ� ����� ���޾Ҵ�. ���� ������ �޼��� ť�� �������, �ƹ��� ������� �ְ� ���� �� �ִ����� �׽�Ʈ �ߴ�. �׷�����, ���� ť�� ��带 "660"���� "600"���� �����Ϸ��� ���� ��, �� �ڽ��� ť�� ���� �� �ڽ��� ���ƹ����� ����� �ʷ��ߴ�. ��������� ���� �� �ҽ� ���丮�� ���� �������� �޼��� ť �����۾��� �׽�Ʈ �� �� ������. ���� IPC Ű�� ����� ���� ftok() �Լ��� ����߱⿡, ���� ť�� �����Ϸ��� �� �� ���� ������ �㰡����(permission)�� ���� ���� ���ߴ�. ������ �ִ� ��ħ�� �ᱹ ���� ���� �ý��� �����ڿ��� �޼��� ť�� ���������� �� �װ� ���� ���� ipcrm ���ɾ ������Ѿ� �ϴ����� �ѽð����� �����ϰ� ������ ���´�.
ť�κ��� ���������� �޼����� ���� ��, �޼����� ���ŵȴ�. �տ����� ����ߴ� ��ó��, IPC ��ü�� ������ ���ŵǰų� �ý����� ��������� �ʴ� �� �ý��ۿ� ���� �ִ´�. �׷��Ƿ�, �츮�� �޼��� ť�� ������ Ŀ�ξȿ� �����ϰ� ���� �޼����� ����� �Ŀ��� ��� ����� �� �ִ�. �޼��� ť�� ���� �ֱ�(life cycle)�� �ϼ��ϱ� ���� IPC_RMID ���ɾ ����Ͽ� msgctl()�� ȣ�⿡ ���� ���ŵǾ�� �Ѵ�.:


int remove_queue( int qid )
{
        if( msgctl( qid, IPC_RMID, 0) == -1)
        {
                return(-1);
        }
        
        return(0);
}

�� wrapper �Լ��� ť�� ������� ���ŵǸ� 0�� ��ȯ�ϰ� �ƴϸ� -1�� ��ȯ�Ѵ�. ť�� ���Ŵ� �ڿ������� atomic�ϰ� � ���������� ť�� ���� � �Ϸ��� ���ٵ� �������� ������ ���̴�.


����:�ý��� ȣ��:msgsnd() ����:msgtool:��ȣ�ۿ� �޼��� ť ������

Copyright (c) 1996,1997 by Euibeom.Hwang & SangEun.Oh All Rights Reserved

Email To:Webmaster , Another address
LAST UPDATE Nov 18,1997
Created Nov 17,1997