2009-10-18 11 views
0

유닉스 시스템에서 C로 코드를 작성했습니다. 메시지 대기열 서버를 만들었습니다. 새 메시지를받을 때마다 나는 포크하고 자식 프로세스는 새 클라이언트를 처리합니다. 서버는 새 클라이언트를 기다립니다. 여기에 코드가 있습니다. msgrcv의 오류 : 잘못된 인수

for (;;) 
{ 
     struct my_msgbuf buf; 

     if (msgrcv (msqid, &(buf.mtype), sizeof (buf), 1, 0) == -1) 
     perror ("msgrcv"); 


    if((pid = fork())<0) 
    perror("fork"); 


    if(pid==0) 
    { 
    //child code 
    } 
} 

이제 코드는 첫 번째 반복 작동하지만 두 번째 반복 위해 msgrcv에 다음과 같은 오류를 제공합니다 - 위해 msgrcv : 대신 새 메시지를 기다리고의 잘못된 인수.

답변

0

msgrcvmsgsz 매개 변수를 사용하지 않습니다,하지만이 struct my_msgbuf의 크기가 아니라, 오히려 구조의 mtext[] 필드의 바이트 수입니다.

struct msgbuf을 직접 사용하지 않아도된다고 생각합니다. 적절한 공간으로 나만의 것을 정의하는 것은 정상입니다. 가지고있는대로, buf 선언은 1 바이트 만 할당하고 코드는 커널에 sizeof buf 바이트가 있다는 것을 알려주지 만 그렇지 않습니다. 결과적으로 코드는 정의되지 않은 동작 또는 UB를 호출합니다.

이 수도 있고 설명 할 수 EINVAL하지만 하나는 항상 코드가 할당을 표시하지 않습니다 ...

+0

없음을 didnt 작업 ... –

+0

을 알려진 버그를 수정하고 UB는 추가 분석을 taints 때문에 다시 테스트해야하는' mtype'. 합리적으로 조정되고 있습니까? – DigitalRoss

+0

예 해당 데이터 형식이 구조적으로 길다 –