반응형
msgctl(2)
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
msgctl(2)함수는 msqid의 System V message queue에 대해서 cmd 명령어로 message queue 정보를 조회/변경 및 삭제 작업을 수행합니다.
파라미터
msgid
- msgget(2)가 return한 msqid
cmd
- Message Queue에 대해서 처리하려는 명령어 코드
IPC_STAT : msqid로 생성된 Message Queue의 정보를 읽어서 buf 구조체에 저장합니다.
IPC_SET : msqid로 생성된 Message Queue의 정보 중에서
msg_perm.uid, msg_perm.gid, msg_perm.mode와 msg_ctime의 값을 변경할 수 있습니다.
만약 process가 root권한으로 실행하고 있다면, msg_qbytes 값도 변경할 수 있습니다.
(구조체 정보는 argument buf 참조)
IPC_RMID : msqid로 생성된 Message Queue를 삭제합니다.
Message Queue를 읽기 또는 쓰기로 blocking된 프로세스에서는 EIDRM(errno값) 오류가 발생합니다.
삭제는 삭제권한이 있는 user가 실행했을 때에만 삭제됩니다. argument buf값은 무시됩니다.
buf
- cmd의 (IPC_STAT, IPC_SET, IPC_RMID)값에 따라 struct msqid_ds는 읽기용/쓰기용/무시됩니다.
struct msqid_ds 구조체
struct msqid_ds {
struct ipc_perm msg_perm; /* Ownership and permissions */
time_t msg_stime; /* Time of last msgsnd(2) */
time_t msg_rtime; /* Time of last msgrcv(2) */
time_t msg_ctime; /* Time of last change */
unsigned long __msg_cbytes; /* Current number of bytes in queue (nonstandard) */
msgqnum_t msg_qnum; /* Current number of messages in queue */
msglen_t msg_qbytes; /* Maximum number of bytes allowed in queue */
pid_t msg_lspid; /* PID of last msgsnd(2) */
pid_t msg_lrpid; /* PID of last msgrcv(2) */
};
struct ipc_perm {
key_t __key; /* Key supplied to msgget(2) */
uid_t uid; /* Effective UID of owner */
gid_t gid; /* Effective GID of owner */
uid_t cuid; /* Effective UID of creator */
gid_t cgid; /* Effective GID of creator */
unsigned short mode; /* Permissions */
unsigned short __seq; /* Sequence number */
};
RETURN
-1이 아님
- 정상적으로 실행되었습니다.
-1
- 오류가 발생하였으며, 상세한 오류내용은 errno 변수에 설정됩니다.
EACCES : cmd가 IPC_STAT일 때에 msqid에 대해서 읽기 권한이 없습니다.
EFAULT : cmd가 IPC_SET 또는 IPC_STAT의 경우 buf가 접근할 수 없는 주소입니다.
EIDRM : msqid가 삭제된 id입니다.
EINVAL : msqid가 유효하지 않은 ID이거나 cmd가 유효하지 않은 명령어입니다.
EPERM : cmd가 IPC_SET 또는 IPC_RMID일 때에 현재 실행중인 프로셋의 effective user ID가
shared memory를 생성한 user가 아니거나 owner가 아니어서 변경권한이 없습니다.
활용 예제
#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int main(int argc, char *argv[])
{
int qid;
int msgkey;
char dir[256];
/* Message Queue의 key를 생성합니다. */
snprintf(dir, 256, "%s/msg_home", getenv("HOME"));
msgkey = ftok(dir, 'M');
/* 이미 생성한 Message Queue ID를 얻습니다. */
if((qid = msgget(msgkey, 0666)) == -1) {
perror("msgget error");
return 1;
}
/* Message Queue를 삭제합니다. */
if (msgctl(qid, IPC_RMID, NULL) == -1) {
perror("msgctl error");
exit(1);
}
return 0;
}
반응형
'C언어 header > sys | msg.h' 카테고리의 다른 글
msgrcv(2) -System V Message Queue에서 데이터 수신 (0) | 2019.09.29 |
---|---|
msgsnd(2) - System V Message Queue로 데이터 전송 (0) | 2019.09.29 |
msgget(2) - System V message queue id 생성 (0) | 2019.09.29 |