a.out 프로세스에서 메시지 큐를 생성하여 메시지를 보내면 프로세스 b.out 에서 이 메시지 큐로부터 메시지를
읽어서 출력하는 프로그램
a.out
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <signal.h>
#define SIZE 124
void signalHandler(int signo);
/* 메시지 저장하는 데이터형으로 첫 번째 멤버는 메시지 형식이어야 함 */
struct {
long type;
char data[SIZE];
} msg_data={1, "Linux C Programming"};
int msqid;
main()
{
/* 1234 키를 갖는 메시지 큐를 생성하고 메시지 큐 식별자인 정수값을 반환.
만약 1234 키의 메시지 큐가 있으면 메시지 큐에 접근하여 식별자를 반환 */
if(msqid = msgget((key_t)1234, IPC_CREAT|0666) == -1) {
perror("msgget failed");
exit(1);
}
/* msg_data 메시지를 msqid 메시지 큐에 전송 */
if(msgsnd(msqid, &msg_data, strlen(msg_data.data), 0) == -1) {
perror("msgsnd failed");
exit(1);
}
/* SIGINT 시그널 받으면 signalHandler 실행하도록 설정 */
signal(SIGINT, signalHandler);
pause();
}
void signalHandler(int signo)
{
/* msqid 메시지 큐 삭제 */
if(msgctl(msqid, IPC_RMID, 0) == -1) {
perror("msgctl failed");
exit(1);
}
exit(0);
}
b.out
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <signal.h>
#define SIZE 124
struct {
long type;
char data[SIZE];
} msg_data;
main()
{
int msqid;
struct msqid_ds msg_stat;
/* 1234 키의 메시지 큐가 있으면 접근해서 식별자 받음 */
if(msqid = msgget((key_t)1234, IPC_CREAT|0666) == -1) {
perror("msgget failed");
exit(1);
}
/* msqid 메시지 큐에서 메시지 읽어 msg_data에 저장 */
if(msgrcv(msqid, &msg_data, SIZE, 0, 0) == -1) {
perror("msgrcv failed");
exit(1);
}
printf("data read from message queue : %s\n", msg_data.data);
/* msqid 메시지 큐 정보를 얻어 msg_stat에 저장 */
if(msgctl(msqid, IPC_STAT, &msg_stat) == -1) {
perror("msgctl failed");
exit(1);
}
/* msg_stat.msg_lspid 프로세스에게 SIGINT 시그널 보냄 */
kill(msg_stat.msg_lspid, SIGINT);
exit(0);
}
[localhost@local]#a.out &
[localhost@local]#b.out
data read from message queue : Linux C Programing
--------------------------------------------------------------------------------------------------------
우선순위가 있는 메시지를 주고 받는예
a.out프로세스는 표준입력장치로 부터 데이터와 우선순위를 입력받아 메시지 큐로 전송하는 프로그램이고
b.out프로세스는 메시지 큐로부터 우선순위가 높은 메시지로 부터 출력하는 프로그램이다
a.out
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define SIZE 124
/* 메시지 형식을 저장하는 type 멤버를 우선순위를 저장하는 용도로 사용한다. */
struct {
long type;
char data[SIZE];
} msg_data;
main()
{
int msqid, data_len;
char buffer[SIZE];
/* 1234 키의 메시지 큐 생성 */
if(msqid = msgget((key_t)1234, IPC_CREAT|0666) == -1) {
perror("msgget failed");
exit(1);
}
while(1) {
/* 표준입력장치로부터 데이터 입력 */
printf("input data => ");
scanf("%s", buffer);
/* 입력받은 내용이 ‘quit’이면 while 문 벗어남 */
if(!strcmp(buffer, "quit"))
break;
/* 표준입력장치로부터 우선순위 입력 */
printf("input priority => ");
scanf("%ld", &(msg_data.type));
strcpy(msg_data.data, buffer);
/* msg_data 메시지를 msqid 메시지 큐에 전송 */
if(msgsnd(msqid, &msg_data, strlen(msg_data.data), 0) == -1) {
perror("msgsnd failed");
exit(1);
}
}
exit(0);
}
b.out
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <errno.h>
#define SIZE 124
#define PRIOR 10 /* 우선순위 최대값 */
struct {
long type;
char data[SIZE];
} msg_data;
main()
{
int msqid, data_len;
/* 1234 키의 메시지 큐가 있으면 접근해서 식별자 받음 */
if(msqid = msgget((key_t)1234, IPC_CREAT|0666) == -1) {
perror("msgget failed");
exit(1);
}
while(1) {
/* (-1*PRIOR)에 의해 메시지 큐에서 메시지 형식 값이 작은 메시지부터 읽음.
IPC_NOWAIT에 의해 메시지 없으면 실패로 -1 반환하는데 이때의 errno는 ENOMSG */
if((data_len=msgrcv(msqid, &msg_data, SIZE, (-1*PRIOR), IPC_NOWAIT)) == -1) {
if(errno == ENOMSG) {
printf("no message\n");
break;
}
perror("msgrcv failed");
break;
}
msg_data.data[data_len]='\0';
printf("data : %s [%ld]\n", msg_data.data, msg_data.type);
}
/* msqid 메시지 큐 삭제 */
if(msgctl(msqid, IPC_RMID, 0) == -1) {
perror("msgctl failed");
exit(1);
}
exit(0);
}
[localhost@local]#a.out
input data => Hello
input priority => 7
input data => Programing
input priority => 3
input data => Linux
input priority => 5
[localhost@local]#b.out
data : Programing[3]
data : Linux[5]
data : Hello[7]
no message
'EMBEDDED > SYSTEM Proc' 카테고리의 다른 글
[Network] semget(),semctl(),semop() (0) | 2012.07.13 |
---|---|
[Network] shmget(),shmat(),shmdt(),shmctl() 관련 예제 (0) | 2012.07.13 |
[Network] mkfifo() 예제 (0) | 2012.07.13 |
[Network] pipe() 예제 (0) | 2012.07.13 |
[Network] popen(), pclose() 함수를 이용한 통신 (0) | 2012.07.13 |