2011-03-07 6 views
2

누구든지 내 프로그램의 오류가 무엇인지 지적 해 줄 수 있습니까? 사전에메시지 큐 : msgsnd failed : 잘못된 인수

덕분에, kingsmasher1

#include <stdio.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/ipc.h> 
#include <sys/msg.h> 
#include <string.h> 
#include <errno.h> 

typedef struct msgbuf { 
    long mtype;  /* message type, must be > 0 */ 
    char mtext[15]; /* message data */ 
} msgbuf; 

int main() { 
    key_t key; 
    int msqid, pid, length; 
    msgbuf buf; 

    msqid=msgget(IPC_PRIVATE,IPC_CREAT); 

    if(msqid==-1){ 
     perror("msgget failed"); 
     return; 
    } 
    else { 
     printf("msgget succeeded. ID:%u",msqid); 
    } 

    pid=fork(); 

    if(pid==-1) { 
     perror("fork failed\n"); 
    } 

    buf.mtype=1; 
    strcpy(buf.mtext, "This is a test message"); 
    length=sizeof(buf.mtext); 

    if(msgsnd(msqid,&buf,length,0)!=0) { 
     perror("msgsnd failed:\n"); 
    } 
    else { 
     printf("msgsnd succeeded\n"); 
    } 
} 

출력 : msgsnd는 실패 : 잘못된 인수

답변

8

을 당신은 충분히 "This is a test message"에 대한 buf.mtext (15 자) 공간 (한 번 더 plust (23 개) 문자가없는 NUL 터미네이터의 경우).

나는 당신의 유형 또는 스택에 대한 정보도 일부 다른 조각을 손상 할 수있는 좋은 기회가 말하고 싶지만 (같은 msqid 또는 length 또는 key).

실제 문제인지 여부에 관계없이 아직 정의되지 않은 동작이므로 수정해야합니다. 내가 대체하여 확인한다 할 거라고 가장 먼저하는 일 :

strcpy(buf.mtext, "This is a test message"); 

와 함께 : 그것을 해결되는지

strcpy(buf.mtext, "XYZZY"); // 5 plus the NUL 

볼 수 있습니다.

또는 mtext을 넣으면 거기에있는 데이터를 저장할 수 있습니다.

+0

고마워요, 그것은 해결되었습니다 :-) – kingsmasher1