2016-11-02 7 views
1

이것은 msg를 대기열로 보내는 간단한 프로그램이지만 "snd 오류"를 출력으로 제공합니다. 큐가 생성됩니다. 나는 ipcs -q로 확인했다. 내가 뭘 잘못 했니?IPC 대기열 msgsnd 오류

#include<stdio.h> 
#include<unistd.h> 
#include<sys/ipc.h> 
#include<sys/msg.h> 
#include<sys/types.h> 
#include<stdlib.h> 
struct msg{ 
int mtype; 
char mtext[1024]; 

}snd; 
void main() 
{ 
int id; 
if(id=msgget(1234,IPC_CREAT|0666)<0) 
{ 
    printf("ipc error"); 
} 
else{ 
    snd.mtype=1; 
    scanf("%[^\n]",snd.mtext); 
    getchar(); 

    if(msgsnd(id,&snd,sizeof(snd.mtext),IPC_NOWAIT)<0){ 
      printf("snd error"); 
    } 
    else { 
     printf("msg snd"); 
    } 

} 

} 
+1

주위에 적어도 괄호에 넣어? fgets를 사용하여보세요? –

+0

하지만 그건 내가 추측하는 문제가 아니어야합니다. 복사 붙여 넣기를 시도하고 http://simplestcodings.blogspot.in/2010/08/ipc-message-queue-implementation-in-c.html에서 코드를 실행하면 제대로 작동합니다. 하지만 내 프로그램이 작동하지 않니? –

답변

0
내가 잘못한 것을

?

반환 코드 msgsnd을 확인하십시오. 이는 이미 많은 프로그래머보다 앞서 있음을 의미합니다. errno이 어디하지만 당신은

반환 값 두 함수 모두 반환, 실패하면 -1 errno를 나타내는 오류
,

을 명시 msgsnd의 전체 매뉴얼을 읽지 못했어요 중요한 부분.

이 더 볼

도 msgsnd는()가 실패하면, errno는 다음 값 중 하나로 설정됩니다
잘못

에러를 갈 수도 보여줍니다 에러라는 이름의 섹션있다 :

EACCES The calling process does not have write permission on the 
      message queue, and does not have the CAP_IPC_OWNER capability. 

    EAGAIN The message can't be sent due to the msg_qbytes limit for the 
      queue and IPC_NOWAIT was specified in msgflg. 

...

더 아래 여전히3210

, 당신은 예 섹션을 찾을 수

The program below demonstrates the use of msgsnd() and msgrcv(). 

...

msgsnd의 사용이 중요한 관용구를 보여줍니다

: 때 오류가 발생하여 특정 오류가 errno에보고 된 경우이 오류는 perror

로 인쇄 될 수 있습니다.
if (msgsnd(qid, (void *) &msg, sizeof(msg.mtext), 
      IPC_NOWAIT) == -1) { 
    perror("msgsnd error"); 
    exit(EXIT_FAILURE); 
} 

perror에는 msgsnd으로 전화하여 잘못된 점을 자세히 설명하는 메시지가 표시됩니다. 다른 시스템 호출과 함께 사용할 수도 있습니다. 수동 "잘못된 인수"(EINVAL)에 따르면


EINVAL msqid 인 중 하나가 유효 또는 msgsz가 덜 0보다
EINVAL (리눅스 3.14 이후) msgflg에 MSG_COPY 지정된 의미 IPC_NOWAIT는 아 U니다.
EINVAL (Linux 3.14 이후) msgflg MSG_COPY와 MSG_EXCEPT를 모두 지정했습니다.

MSG_COPY을 지정하지 않으므로 오류가 첫 번째가되어야합니다.

  • msgsz은 그래서 유효하지 않은 msqid 인 0이어야합니다
  • 보다 확실히 큰! 당신이

    if(id = msgget(1234, IPC_CREAT | 0666) < 0) 
    

    볼 때

당신은 (id = msgget(...)) 주위에 괄호가 누락을 참조하십시오. 대체로 msgget은 값> 0을 반환하므로 msgget(...) < 0은 false이고 id는 0 (false)이되고 else 분기가 사용됩니다.

결과적으로 msgsnd(0, ...)을 호출하면 오류의 원인이 될 가능성이 큽니다.) (이 문제를 해결하려면


,

id = msgget(1234, IPC_CREAT | 0666); 
if (id < 0) { 
... 
} else { 
... 
} 

명시 적 또는 왜 당신이 다음 getchar가 scanf와하는 과제

if ((id = msgget(1234, IPC_CREAT | 0666)) < 0) { 
+0

"잘못된 인수"라고 표시됩니다. 나는 해결책을 찾았지만 나는 그런 종류의 문제가 없다. 내 크기가 좋아 ... 좋아요. 나는 enterd가 1024 미만입니다. mtype = 1은 양수입니다. 그리고 sizeof (snd.mtext)도 잘못이 아닙니다. 이제 문제가 무엇입니까? –

+0

내가 직면하고있는 문제는 작동하는 비슷한 프로그램을 실행하려고 할 때입니다. 그러나이 프로그램은 작동하지 않습니다. 이 프로그램은 http://simplestcodings.blogspot.in/2010/08/ipc-message-queue-implementation-in-c.html과 내가 작성한 또 다른 프로그램을 실행할 때 잘 동작합니다. 왜 이것 하나? –