msgget과 고유키값 얻기

sok1029의 이미지

->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;

}

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.