msgget과 고유키값 얻기
->1.아래 소스에서 안되는 부분이 분명 키를 얻을 때 경로명과 고유id를 틀리게 했는데
key1과 key2의 값이 같다는 것
->2. 소스 검은 부분 으로 표시한 부분의 의도는
터미널1에서 프로그램을 실행시켜서 부모가 key1으로 메세지 큐를 만들고 자식이 key2로 메세지 큐를 만든 상태로 있고 터미널2에서 프로그램을 실행시키면 터미널2 부모는 key1으로 만든 메세지 큐가 있으므로 만들지 않고 실패 한다.
그리고 if문안으로 들어가 key2로 만들어진 메세지큐의 id를 얻는다.
터미널2 자식에서는 key2로 만든 메세지 큐가 있으므로 key1으로 만든 메세지 큐의 id를 얻는다.
즉 첫번째 터미널의 부모와 두번째 터미널의 자식이 같은 메세지 큐 id를 가지게 되고
첫번쨰 터미널의 자식과 두번쨰 터미널의 부모가 같은 메세지 큐 id를 가지게 되어야 하는데요.
결과는 같은 키에 서로다른 메세지 큐 4개를 생성하네요 (한 터미널 실행 시킬때마다 2개씩 늘어남)
수정 좀 부탁드립니다.
#include
#include
#include
#include
#include
#define PERMS 0644
#define MAX 1024
main()
{
int pid;
int len; //message length ->for dynamic memory
char buffer[MAX]; //stream input message save
void * buf; //receive message save
int msqid1, msqid2;
const char * path1="/home/sok1029/1";
const char * path2="/home/sok1029/2";
struct msgbuf
{
long int message_type;
char * message_text; //check******************
}mymsg;
key_t key1,key2;
//**************Get key**********************
if((key1=(ftok(path1,'a'))==-1 )||( key2=(ftok(path2,'b'))==-1) )
{
return -1;
} //Get key by each other path+id .if fail return.
// printf("%d %d",key1,key2);
pid=fork();
//****((PARENT))***************************************
if(pid!=0) //parent //write
{ //msgbuf initializaion
///**********Get msqid1*******************************
if((msqid1=(msgget(key1,PERMS | IPC_CREAT |IPC_EXCL)))==-1)
//Already msq is by same key1
{
printf("Aaa");
if( msqid1=(msgget(key2,PERMS |IPC_CREAT) )==-1)
//Get msqid by key2
{
return -2; //fail
}
printf("msqid1=%d",msqid1);
}
///*********** Message Write && SEND*************************
//
while(1)
{
scanf("%s", buffer); //insert stream
len=strlen(buffer);
mymsg.message_type=1;
mymsg.message_text=(char*)malloc(len+1); //dynamic memory
strncpy(mymsg.message_text,buffer,len+1);
if(msgsnd(msqid1,(void *)&mymsg,len+1,0 )==-1)
//write message to msq
{
return -3;
}
// free
}
}
//**(Child)****************************************
else //child
{
//*******Get msqid2**********************************
if((msqid2=(msgget(key2,PERMS | IPC_CREAT |IPC_EXCL)))==-1)
//Already msq is by key2
{
printf("bbb");
if(msqid2=(msgget(key1,PERMS |IPC_CREAT))==-1) {
return -4;
}
printf("msqid2:%d",msqid2);
}
//*********************RECIVE***********************
while(1)
{
if( msgrcv(msqid2,buf,sizeof(buf),0,0 )==-1 ) //check
{
return -5;
}
printf("[MSGREV]:%s",buf);
}
}
return;
}
댓글 달기